refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
//! Behavior guarantees for the `orchestration` module.
|
|
|
|
|
|
|
|
|
|
mod run_fsm {
|
refactor: `mvp-system` is now a standalone app, `myelin`
Promote the `mvp-system` workspace library crate to a standalone application at `apps/myelin`, rebranding the MVP system along with its binaries, node image, and spec.
- workspace `Cargo.toml`: swap member `crates/mvp-system` -> `apps/myelin` and drop `apps` from `exclude` so the app joins the workspace
- `apps/myelin/Cargo.toml`: declare package `myelin` with `autobins = false` and explicit `[[bin]]` targets `myelin-worker`, `myelin-orchestrator`, `myelin-chat`
- `apps/myelin/src`: move the whole `mvp-system` source tree and rebrand module surfaces (`chat/mod.rs`, `prompt/mod.rs`); add `bin/chat.rs` (`myelin::run_chat_from_args`) and delete the old `mvp_chat.rs`
- `apps/myelin/node-image`: relocate the worker image assets from `apps/mvp-node/` (Dockerfile, Dockerfile.base, tinygrad_worker.py, entrypoint, e2e script) and rename `MVP_SYSTEM_SPEC.md` -> `MYELIN_SPEC.md`
- `xtask`: rewrite build/reference paths for the rename (~1000-line churn); add `crates/dashboard/ACTOR_PANEL_SPEC.md`
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-08-01 09:46:55 +00:00
|
|
|
//! Black-box contract tests for the Myelin orchestrator run FSM.
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
//!
|
|
|
|
|
//! These tests intentionally know only the public orchestrator surface:
|
|
|
|
|
//!
|
|
|
|
|
//! - pool, plan, stage, endpoint, token, fault, and stop events in
|
|
|
|
|
//! - commands, lifecycle events, and terminal outcome out
|
|
|
|
|
//!
|
|
|
|
|
//! They assert the guarantees in
|
|
|
|
|
//! `specs/BEHAVIOR_GUARANTEES.md`.
|
|
|
|
|
|
|
|
|
|
use crate::run_fsm as fsm;
|
2026-08-03 10:18:24 +00:00
|
|
|
use crate::tests::harness::OrchestratorHarness;
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
|
|
|
|
|
// A three-stage plan proves multi-stage provisioning and readiness without
|
|
|
|
|
// making tests depend on any placement heuristic. The plan is already valid;
|
|
|
|
|
// these tests are about how the orchestrator consumes it.
|
|
|
|
|
fn committed_plan() -> fsm::RunPlan {
|
|
|
|
|
fsm::RunPlan::test_linear(
|
|
|
|
|
fsm::RunId(7),
|
|
|
|
|
vec![
|
|
|
|
|
fsm::StageRef {
|
|
|
|
|
stage_index: 0,
|
|
|
|
|
node_id: fsm::NodeId(10),
|
|
|
|
|
},
|
|
|
|
|
fsm::StageRef {
|
|
|
|
|
stage_index: 1,
|
|
|
|
|
node_id: fsm::NodeId(11),
|
|
|
|
|
},
|
|
|
|
|
fsm::StageRef {
|
|
|
|
|
stage_index: 2,
|
|
|
|
|
node_id: fsm::NodeId(12),
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// The harness is the black-box public boundary for the run FSM. It accepts
|
|
|
|
|
// observable events and records emitted commands/events; tests never inspect an
|
|
|
|
|
// internal FSM enum or private readiness counter.
|
2026-08-03 10:18:24 +00:00
|
|
|
fn new_run() -> OrchestratorHarness {
|
|
|
|
|
OrchestratorHarness::new(fsm::RunConfig {
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
max_tokens: 4,
|
|
|
|
|
prompt: vec![101, 102, 103],
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Stage readiness events are generated from the committed plan so the tests
|
|
|
|
|
// prove readiness by stage identity instead of relying on command ordering.
|
|
|
|
|
fn stage_ready_events(plan: &fsm::RunPlan) -> Vec<fsm::RunEvent> {
|
|
|
|
|
plan.stages
|
|
|
|
|
.iter()
|
|
|
|
|
.map(|stage| fsm::RunEvent::StageReady {
|
|
|
|
|
run_id: plan.run_id,
|
|
|
|
|
stage_index: stage.stage_index,
|
|
|
|
|
})
|
|
|
|
|
.collect()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Transcript positions turn ordering claims into proofs over observable output.
|
|
|
|
|
// If an event is missing, the test fails at the boundary where users and other
|
|
|
|
|
// components would also lose the guarantee.
|
|
|
|
|
fn position_of(events: &[fsm::LifecycleEvent], needle: &fsm::LifecycleEvent) -> usize {
|
|
|
|
|
events
|
|
|
|
|
.iter()
|
|
|
|
|
.position(|event| event == needle)
|
|
|
|
|
.expect("expected lifecycle event missing")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This proves planning and provisioning are gated by PoolReady, and that the
|
|
|
|
|
// orchestrator provisions exactly the committed stages and local token endpoints
|
|
|
|
|
// from a valid RunPlan.
|
|
|
|
|
#[test]
|
|
|
|
|
fn planning_and_provisioning_start_only_after_pool_ready() {
|
|
|
|
|
// Start the run and give it a valid plan, but no PoolReady event.
|
|
|
|
|
let plan = committed_plan();
|
|
|
|
|
let mut harness = new_run();
|
|
|
|
|
harness.observe(fsm::RunEvent::PlanAvailable(plan.clone()));
|
|
|
|
|
|
|
|
|
|
// Without PoolReady, provisioning must not begin.
|
|
|
|
|
assert!(
|
|
|
|
|
!harness
|
|
|
|
|
.commands()
|
|
|
|
|
.iter()
|
|
|
|
|
.any(|command| { matches!(command, fsm::RunCommand::ProvisionStage { .. }) })
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Once PoolReady is observed, the committed plan may be provisioned.
|
|
|
|
|
harness.observe(fsm::RunEvent::PoolReady {
|
|
|
|
|
nodes: plan.stage_nodes(),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Every planned stage gets exactly one provision command.
|
|
|
|
|
let provisioned = harness
|
|
|
|
|
.commands()
|
|
|
|
|
.iter()
|
|
|
|
|
.filter_map(|command| match command {
|
|
|
|
|
fsm::RunCommand::ProvisionStage { provision } => Some(provision.stage_index),
|
|
|
|
|
_ => None,
|
|
|
|
|
})
|
|
|
|
|
.collect::<std::collections::BTreeSet<_>>();
|
|
|
|
|
let expected = plan
|
|
|
|
|
.stages
|
|
|
|
|
.iter()
|
|
|
|
|
.map(|stage| stage.stage_index)
|
|
|
|
|
.collect::<std::collections::BTreeSet<_>>();
|
|
|
|
|
assert_eq!(provisioned, expected);
|
|
|
|
|
|
|
|
|
|
// Provisioning must not mention nodes outside the committed plan.
|
|
|
|
|
let plan_nodes = plan
|
|
|
|
|
.stage_nodes()
|
|
|
|
|
.into_iter()
|
|
|
|
|
.collect::<std::collections::BTreeSet<_>>();
|
|
|
|
|
for command in harness.commands() {
|
|
|
|
|
if let fsm::RunCommand::ProvisionStage { provision } = command {
|
|
|
|
|
assert!(plan_nodes.contains(&provision.node_id));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token endpoints are created locally from the same committed plan.
|
|
|
|
|
assert!(harness.commands().iter().any(|command| {
|
|
|
|
|
matches!(command, fsm::RunCommand::CreateTokenInEndpoint { run_id } if *run_id == fsm::RunId(7))
|
|
|
|
|
}));
|
|
|
|
|
assert!(harness.commands().iter().any(|command| {
|
|
|
|
|
matches!(command, fsm::RunCommand::CreateTokenOutEndpoint { run_id } if *run_id == fsm::RunId(7))
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This proves prompt injection is blocked until every planned stage and both
|
|
|
|
|
// local token endpoints are ready. Duplicate readiness must not count as a
|
|
|
|
|
// missing stage, and foreign readiness must fault or reject.
|
|
|
|
|
#[test]
|
|
|
|
|
fn readiness_barrier_controls_prompt_injection() {
|
|
|
|
|
// Provision a valid plan after PoolReady.
|
|
|
|
|
let plan = committed_plan();
|
|
|
|
|
let mut harness = new_run();
|
|
|
|
|
harness.observe(fsm::RunEvent::PoolReady {
|
|
|
|
|
nodes: plan.stage_nodes(),
|
|
|
|
|
});
|
|
|
|
|
harness.observe(fsm::RunEvent::PlanAvailable(plan.clone()));
|
|
|
|
|
|
|
|
|
|
// A duplicate StageReady for stage 0 cannot satisfy stage 1 or 2.
|
|
|
|
|
harness.observe(fsm::RunEvent::StageReady {
|
|
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
stage_index: 0,
|
|
|
|
|
});
|
|
|
|
|
harness.observe(fsm::RunEvent::StageReady {
|
|
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
stage_index: 0,
|
|
|
|
|
});
|
|
|
|
|
harness.observe(fsm::RunEvent::TokenInEndpointReady);
|
|
|
|
|
harness.observe(fsm::RunEvent::TokenOutEndpointReady);
|
|
|
|
|
assert!(
|
|
|
|
|
!harness
|
|
|
|
|
.commands()
|
|
|
|
|
.iter()
|
|
|
|
|
.any(|command| { matches!(command, fsm::RunCommand::InjectTokenObject { .. }) })
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Complete the remaining stage readiness facts.
|
|
|
|
|
for event in stage_ready_events(&plan).into_iter().skip(1) {
|
|
|
|
|
harness.observe(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Prompt injection is the public start signal after the full barrier.
|
|
|
|
|
assert!(harness.commands().iter().any(|command| {
|
|
|
|
|
matches!(
|
|
|
|
|
command,
|
|
|
|
|
fsm::RunCommand::InjectTokenObject {
|
|
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
object: fsm::TokenObjectInjection {
|
|
|
|
|
sequence: 0,
|
|
|
|
|
payload: fsm::TokenObjectPayload::Prompt { tokens },
|
|
|
|
|
},
|
|
|
|
|
} if tokens.as_slice() == [101, 102, 103]
|
|
|
|
|
)
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
// Unknown stage readiness must not silently advance another run.
|
|
|
|
|
let mut invalid = new_run();
|
|
|
|
|
invalid.observe(fsm::RunEvent::PoolReady {
|
|
|
|
|
nodes: plan.stage_nodes(),
|
|
|
|
|
});
|
|
|
|
|
invalid.observe(fsm::RunEvent::PlanAvailable(plan));
|
|
|
|
|
invalid.observe(fsm::RunEvent::StageReady {
|
|
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
stage_index: 99,
|
|
|
|
|
});
|
feat(provisioning): add level-triggered cluster reconciler
Introduce a pure, level-triggered reconciler in `crates/provisioning`
that drives a declared cluster shape toward convergence over the
existing node lifecycle, replacing the edge-triggered imperative node
orchestration in `apps/myelin`.
- `reconcile`/`reconcile_node`/`observe`: pure decider and observation
folder with stable logical-node identity, per-attempt operation
identity, and deterministic retry backoff; `ClusterDriver` is the sole
writer of observed state, coalescing triggers, recording operations as
pending before dispatch, and scheduling timed requeues.
- `IdempotentEffectExecutor`: deduplicates submissions by
`(run_id, logical_node_id, attempt)` and runs provider work on the
engine-hosted blocking substrate, never blocking a reconcile pass.
- Myelin integration: `MyelinEffectBackend` bridges `ProvisionPlugin` to
the executor contract; `LocalProcessPlugin`/`LocalDockerPlugin`
provider adapters; `ProvisionedClusterGuard` pumps triggers,
observations, and due operations.
- Retire the imperative acquire/bootstrap/teardown sequencing across
`apps/myelin` orchestration, staging, observability, and provider
adapters in favor of the declarative driver.
- Move the reconciler specification to `docs/specs/archive`.
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-08-12 07:49:18 +00:00
|
|
|
assert!(
|
|
|
|
|
invalid
|
|
|
|
|
.events()
|
|
|
|
|
.iter()
|
2026-08-22 17:16:56 +00:00
|
|
|
.any(|event| { matches!(event, fsm::LifecycleEvent::Faulted { .. }) })
|
feat(provisioning): add level-triggered cluster reconciler
Introduce a pure, level-triggered reconciler in `crates/provisioning`
that drives a declared cluster shape toward convergence over the
existing node lifecycle, replacing the edge-triggered imperative node
orchestration in `apps/myelin`.
- `reconcile`/`reconcile_node`/`observe`: pure decider and observation
folder with stable logical-node identity, per-attempt operation
identity, and deterministic retry backoff; `ClusterDriver` is the sole
writer of observed state, coalescing triggers, recording operations as
pending before dispatch, and scheduling timed requeues.
- `IdempotentEffectExecutor`: deduplicates submissions by
`(run_id, logical_node_id, attempt)` and runs provider work on the
engine-hosted blocking substrate, never blocking a reconcile pass.
- Myelin integration: `MyelinEffectBackend` bridges `ProvisionPlugin` to
the executor contract; `LocalProcessPlugin`/`LocalDockerPlugin`
provider adapters; `ProvisionedClusterGuard` pumps triggers,
observations, and due operations.
- Retire the imperative acquire/bootstrap/teardown sequencing across
`apps/myelin` orchestration, staging, observability, and provider
adapters in favor of the declarative driver.
- Move the reconciler specification to `docs/specs/archive`.
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-08-12 07:49:18 +00:00
|
|
|
);
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This proves execution has one start signal and advances by the token feedback
|
|
|
|
|
// rule: inject sequence 0 first, then inject k + 1 only after consuming k.
|
|
|
|
|
#[test]
|
|
|
|
|
fn execution_injects_next_sequence_only_after_consuming_previous_token() {
|
|
|
|
|
// Drive a run through the complete readiness barrier.
|
|
|
|
|
let plan = committed_plan();
|
|
|
|
|
let mut harness = new_run();
|
|
|
|
|
harness.observe(fsm::RunEvent::PoolReady {
|
|
|
|
|
nodes: plan.stage_nodes(),
|
|
|
|
|
});
|
|
|
|
|
harness.observe(fsm::RunEvent::PlanAvailable(plan.clone()));
|
|
|
|
|
harness.observe(fsm::RunEvent::TokenInEndpointReady);
|
|
|
|
|
harness.observe(fsm::RunEvent::TokenOutEndpointReady);
|
|
|
|
|
for event in stage_ready_events(&plan) {
|
|
|
|
|
harness.observe(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Sequence 0 must be injected first as a prompt token object.
|
|
|
|
|
let initial_objects = harness
|
|
|
|
|
.commands()
|
|
|
|
|
.iter()
|
|
|
|
|
.filter_map(|command| match command {
|
|
|
|
|
fsm::RunCommand::InjectTokenObject { object, .. } => Some(object),
|
|
|
|
|
_ => None,
|
|
|
|
|
})
|
|
|
|
|
.collect::<Vec<_>>();
|
|
|
|
|
assert_eq!(initial_objects.len(), 1);
|
|
|
|
|
assert_eq!(
|
|
|
|
|
*initial_objects[0],
|
|
|
|
|
fsm::TokenObjectInjection {
|
|
|
|
|
sequence: 0,
|
|
|
|
|
payload: fsm::TokenObjectPayload::Prompt {
|
|
|
|
|
tokens: vec![101, 102, 103],
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(harness.injected_sequences(), vec![0]);
|
|
|
|
|
|
|
|
|
|
// Consuming token 0 permits injecting sequence 1.
|
|
|
|
|
harness.observe(fsm::RunEvent::TokenReceived {
|
|
|
|
|
sequence: 0,
|
|
|
|
|
token_id: 201,
|
|
|
|
|
eos: false,
|
|
|
|
|
});
|
|
|
|
|
assert_eq!(harness.injected_sequences(), vec![0, 1]);
|
|
|
|
|
let decode_object = harness
|
|
|
|
|
.commands()
|
|
|
|
|
.iter()
|
|
|
|
|
.filter_map(|command| match command {
|
|
|
|
|
fsm::RunCommand::InjectTokenObject { object, .. } => Some(object),
|
|
|
|
|
_ => None,
|
|
|
|
|
})
|
2026-08-22 17:16:56 +00:00
|
|
|
.next_back()
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
.expect("decode injection must be recorded");
|
|
|
|
|
assert_eq!(
|
|
|
|
|
*decode_object,
|
|
|
|
|
fsm::TokenObjectInjection {
|
|
|
|
|
sequence: 1,
|
|
|
|
|
payload: fsm::TokenObjectPayload::Decode {
|
|
|
|
|
token_id: 201,
|
|
|
|
|
sampling: fsm::SamplingData { source_sequence: 0 },
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// No additional injection may happen without consuming sequence 1.
|
|
|
|
|
harness.advance_time_ms(10);
|
|
|
|
|
assert_eq!(harness.injected_sequences(), vec![0, 1]);
|
|
|
|
|
|
|
|
|
|
// EOS stops further injection after the consumed sequence.
|
|
|
|
|
harness.observe(fsm::RunEvent::TokenReceived {
|
|
|
|
|
sequence: 1,
|
|
|
|
|
token_id: 2,
|
|
|
|
|
eos: true,
|
|
|
|
|
});
|
|
|
|
|
assert_eq!(harness.injected_sequences(), vec![0, 1]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This proves every run-level fault source records one terminal fault, and the
|
|
|
|
|
// first failure reason is retained if later failures arrive.
|
|
|
|
|
#[test]
|
|
|
|
|
fn first_run_fault_reason_is_terminal_and_sticky() {
|
|
|
|
|
// Prepare an executing run so both setup and execution-time faults would be
|
|
|
|
|
// meaningful if observed.
|
|
|
|
|
let plan = committed_plan();
|
|
|
|
|
let mut harness = new_run();
|
|
|
|
|
harness.observe(fsm::RunEvent::PoolReady {
|
|
|
|
|
nodes: plan.stage_nodes(),
|
|
|
|
|
});
|
|
|
|
|
harness.observe(fsm::RunEvent::PlanAvailable(plan.clone()));
|
|
|
|
|
harness.observe(fsm::RunEvent::TokenInEndpointReady);
|
|
|
|
|
harness.observe(fsm::RunEvent::TokenOutEndpointReady);
|
|
|
|
|
for event in stage_ready_events(&plan) {
|
|
|
|
|
harness.observe(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Inject the first failure source.
|
|
|
|
|
harness.observe(fsm::RunEvent::StageFault {
|
|
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
stage_index: 1,
|
|
|
|
|
reason: fsm::StageFaultReason::WorkerCrashed,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Inject later failures that must not replace the terminal reason.
|
|
|
|
|
harness.observe(fsm::RunEvent::EndpointFault {
|
|
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
endpoint: fsm::EndpointKind::TokenOut,
|
|
|
|
|
});
|
|
|
|
|
harness.observe(fsm::RunEvent::MembershipLost {
|
|
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
node_id: fsm::NodeId(11),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Exactly one terminal fault is recorded.
|
|
|
|
|
let faults = harness
|
|
|
|
|
.events()
|
|
|
|
|
.iter()
|
|
|
|
|
.filter_map(|event| match event {
|
2026-08-22 17:16:56 +00:00
|
|
|
fsm::LifecycleEvent::Faulted { reason, .. } => Some(reason),
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
_ => None,
|
|
|
|
|
})
|
|
|
|
|
.collect::<Vec<_>>();
|
|
|
|
|
assert_eq!(faults.len(), 1);
|
|
|
|
|
assert_eq!(
|
|
|
|
|
*faults[0],
|
|
|
|
|
fsm::RunFaultReason::StageFault {
|
|
|
|
|
stage_index: 1,
|
|
|
|
|
reason: fsm::StageFaultReason::WorkerCrashed,
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn membership_loss_faults_run() {
|
|
|
|
|
let plan = committed_plan();
|
|
|
|
|
let mut membership_lost = new_run();
|
|
|
|
|
membership_lost.observe(fsm::RunEvent::PoolReady {
|
|
|
|
|
nodes: plan.stage_nodes(),
|
|
|
|
|
});
|
|
|
|
|
membership_lost.observe(fsm::RunEvent::PlanAvailable(plan.clone()));
|
|
|
|
|
membership_lost.observe(fsm::RunEvent::MembershipLost {
|
|
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
node_id: fsm::NodeId(12),
|
|
|
|
|
});
|
|
|
|
|
assert!(membership_lost.events().iter().any(|event| {
|
|
|
|
|
matches!(
|
|
|
|
|
event,
|
2026-08-22 17:16:56 +00:00
|
|
|
fsm::LifecycleEvent::Faulted {
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
reason: fsm::RunFaultReason::MembershipLost {
|
|
|
|
|
node_id: fsm::NodeId(12)
|
|
|
|
|
},
|
|
|
|
|
..
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This proves terminal outcomes are mutually exclusive, reject new work, and
|
|
|
|
|
// always lead into teardown for success, fault, and operator stop.
|
|
|
|
|
#[test]
|
|
|
|
|
fn terminal_outcome_is_single_and_requires_teardown() {
|
|
|
|
|
// Complete a run by reaching EOS.
|
|
|
|
|
let plan = committed_plan();
|
|
|
|
|
let mut harness = new_run();
|
|
|
|
|
harness.observe(fsm::RunEvent::PoolReady {
|
|
|
|
|
nodes: plan.stage_nodes(),
|
|
|
|
|
});
|
|
|
|
|
harness.observe(fsm::RunEvent::PlanAvailable(plan.clone()));
|
|
|
|
|
harness.observe(fsm::RunEvent::TokenInEndpointReady);
|
|
|
|
|
harness.observe(fsm::RunEvent::TokenOutEndpointReady);
|
|
|
|
|
for event in stage_ready_events(&plan) {
|
|
|
|
|
harness.observe(event);
|
|
|
|
|
}
|
|
|
|
|
harness.observe(fsm::RunEvent::TokenReceived {
|
|
|
|
|
sequence: 0,
|
|
|
|
|
token_id: 2,
|
|
|
|
|
eos: true,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Completed and Faulted are mutually exclusive public outcomes.
|
|
|
|
|
let completed = harness
|
|
|
|
|
.events()
|
|
|
|
|
.iter()
|
2026-08-22 17:16:56 +00:00
|
|
|
.filter(|event| matches!(event, fsm::LifecycleEvent::Completed { .. }))
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
.count();
|
|
|
|
|
let faulted = harness
|
|
|
|
|
.events()
|
|
|
|
|
.iter()
|
2026-08-22 17:16:56 +00:00
|
|
|
.filter(|event| matches!(event, fsm::LifecycleEvent::Faulted { .. }))
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
.count();
|
|
|
|
|
assert_eq!(completed, 1);
|
|
|
|
|
assert_eq!(faulted, 0);
|
|
|
|
|
|
|
|
|
|
// New token work after terminal outcome begins must be rejected.
|
|
|
|
|
let before = harness.injected_sequences();
|
|
|
|
|
harness.observe(fsm::RunEvent::TokenReceived {
|
|
|
|
|
sequence: 99,
|
|
|
|
|
token_id: 333,
|
|
|
|
|
eos: false,
|
|
|
|
|
});
|
|
|
|
|
assert_eq!(harness.injected_sequences(), before);
|
|
|
|
|
|
|
|
|
|
// Teardown commands must be emitted for every provisioned stage and local
|
|
|
|
|
// endpoint after the terminal outcome.
|
|
|
|
|
let stopped_stages = harness
|
|
|
|
|
.commands()
|
|
|
|
|
.iter()
|
|
|
|
|
.filter_map(|command| match command {
|
|
|
|
|
fsm::RunCommand::StopRun { stage_index, .. } => Some(*stage_index),
|
|
|
|
|
_ => None,
|
|
|
|
|
})
|
|
|
|
|
.collect::<std::collections::BTreeSet<_>>();
|
|
|
|
|
let expected_stages = plan
|
|
|
|
|
.stages
|
|
|
|
|
.iter()
|
|
|
|
|
.map(|stage| stage.stage_index)
|
|
|
|
|
.collect::<std::collections::BTreeSet<_>>();
|
|
|
|
|
assert_eq!(stopped_stages, expected_stages);
|
|
|
|
|
assert!(
|
|
|
|
|
harness.commands().iter().any(|command| {
|
|
|
|
|
matches!(command, fsm::RunCommand::TearDownTokenEndpoints { .. })
|
|
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
let mut stopped = new_run();
|
|
|
|
|
stopped.observe(fsm::RunEvent::PoolReady {
|
|
|
|
|
nodes: plan.stage_nodes(),
|
|
|
|
|
});
|
|
|
|
|
stopped.observe(fsm::RunEvent::PlanAvailable(plan));
|
|
|
|
|
stopped.observe(fsm::RunEvent::OperatorStop {
|
|
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
});
|
|
|
|
|
let stopped_count = stopped
|
|
|
|
|
.events()
|
|
|
|
|
.iter()
|
2026-08-22 17:16:56 +00:00
|
|
|
.filter(|event| matches!(event, fsm::LifecycleEvent::OperatorStopped { .. }))
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
.count();
|
|
|
|
|
let stopped_faults = stopped
|
|
|
|
|
.events()
|
|
|
|
|
.iter()
|
2026-08-22 17:16:56 +00:00
|
|
|
.filter(|event| matches!(event, fsm::LifecycleEvent::Faulted { .. }))
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
.count();
|
|
|
|
|
assert_eq!(stopped_count, 1);
|
|
|
|
|
assert_eq!(stopped_faults, 0);
|
|
|
|
|
assert!(
|
|
|
|
|
stopped.commands().iter().any(|command| {
|
|
|
|
|
matches!(command, fsm::RunCommand::TearDownTokenEndpoints { .. })
|
|
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This proves run_torn_down is emitted exactly once and only after teardown
|
|
|
|
|
// observes every planned stage stop and local endpoint stop.
|
|
|
|
|
#[test]
|
|
|
|
|
fn run_torn_down_is_emitted_once_after_teardown_terminal_state() {
|
|
|
|
|
// Fault a provisioned run so teardown is required.
|
|
|
|
|
let plan = committed_plan();
|
|
|
|
|
let mut harness = new_run();
|
|
|
|
|
harness.observe(fsm::RunEvent::PoolReady {
|
|
|
|
|
nodes: plan.stage_nodes(),
|
|
|
|
|
});
|
|
|
|
|
harness.observe(fsm::RunEvent::PlanAvailable(plan.clone()));
|
|
|
|
|
harness.observe(fsm::RunEvent::StageFault {
|
|
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
stage_index: 0,
|
|
|
|
|
reason: fsm::StageFaultReason::WorkerCrashed,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// StageStopped from only a prefix of stages is not enough to finish
|
|
|
|
|
// teardown.
|
|
|
|
|
harness.observe(fsm::RunEvent::StageStopped {
|
|
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
stage_index: 0,
|
|
|
|
|
});
|
|
|
|
|
assert!(
|
|
|
|
|
!harness
|
|
|
|
|
.events()
|
|
|
|
|
.iter()
|
2026-08-22 17:16:56 +00:00
|
|
|
.any(|event| { matches!(event, fsm::LifecycleEvent::TornDown { .. }) })
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// StageStopped for every stage still is not enough until local endpoints stop.
|
|
|
|
|
harness.observe(fsm::RunEvent::StageStopped {
|
|
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
stage_index: 1,
|
|
|
|
|
});
|
|
|
|
|
harness.observe(fsm::RunEvent::StageStopped {
|
|
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
stage_index: 2,
|
|
|
|
|
});
|
|
|
|
|
assert!(
|
|
|
|
|
!harness
|
|
|
|
|
.events()
|
|
|
|
|
.iter()
|
2026-08-22 17:16:56 +00:00
|
|
|
.any(|event| { matches!(event, fsm::LifecycleEvent::TornDown { .. }) })
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
);
|
|
|
|
|
harness.observe(fsm::RunEvent::TokenEndpointsStopped);
|
|
|
|
|
|
|
|
|
|
// The final event may now appear, exactly once.
|
|
|
|
|
let torn_down_count = harness
|
|
|
|
|
.events()
|
|
|
|
|
.iter()
|
2026-08-22 17:16:56 +00:00
|
|
|
.filter(|event| matches!(event, fsm::LifecycleEvent::TornDown { .. }))
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
.count();
|
|
|
|
|
assert_eq!(torn_down_count, 1);
|
|
|
|
|
|
|
|
|
|
// Ordering is proven over the lifecycle transcript.
|
|
|
|
|
let fault_pos = position_of(
|
|
|
|
|
harness.events(),
|
2026-08-22 17:16:56 +00:00
|
|
|
&fsm::LifecycleEvent::Faulted {
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
reason: fsm::RunFaultReason::StageFault {
|
|
|
|
|
stage_index: 0,
|
|
|
|
|
reason: fsm::StageFaultReason::WorkerCrashed,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
let torn_down_pos = position_of(
|
|
|
|
|
harness.events(),
|
2026-08-22 17:16:56 +00:00
|
|
|
&fsm::LifecycleEvent::TornDown {
|
refactor: prune tests according to spec-defined behavior
Replace the sprawl of narrow per-implementation test files (and the inline #[cfg(test)] modules embedded in source) with a small set of black-box behavior-guarantee suites keyed to the public modules, per the BEHAVIOR_GUARANTEES spec.
- tests/mod.rs: cut the test module list to local_e2e/node/observability/orchestration/prompt/staging/transport (+local_mock), removing bootstrap_datastream/relay_provisioning/run_plan/stage_controller/shard_*/weight_*/tx_rx_edge_actor/worker_edge_adapter/telemetry/shared_ring_helper_abi/orchestrator_run_fsm files
- add tests/orchestration_guarantees.rs (1074 lines) and staging_guarantees.rs (747) as black-box contract suites over the public RunPlan and StageController surfaces, referencing specs/BEHAVIOR_GUARANTEES.md
- add focused node_guarantees, prompt_guarantees, and transport_guarantees suites covering node-agent runtime-ready reporting, prompt defaults/terminality, and endpoint-advertisement relay masking
- rename local_mock_pipeline_integration to local_e2e_guarantees and observability_surface_guarantees to observability_guarantees
- strip the large inline #[cfg(test)] mod tests blocks from source files (orchestration/app.rs -3215, chat/runtime.rs -790, node/worker_node_runtime.rs -522, vastai/mod.rs, gguf_shard/shard_fetch, etc.) and the #[path]-registered shard_* test mods from lib.rs
- Cargo.toml: drop the harness=false mvp_chat_mock [[test]] target, and remove the python_worker_protocol integration test
Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-07-29 10:34:33 +00:00
|
|
|
run_id: fsm::RunId(7),
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
assert!(fault_pos < torn_down_pos);
|
|
|
|
|
}
|
|
|
|
|
}
|