cf94377f30
The flip: within each K-instrument chunk (the structural residency bound from the previous commit), all cells run concurrently on rayon's process- global pool — the same pool the engine's member/window fan-out already shares, so cells x members x windows feed one work-stealing scheduler and the per-cell serial seams (ingest transpose, single-threaded bootstrap) overlap with other cells' work. Results land in index-addressed slots and the ordered outputs are rebuilt in document order: byte-identical outcomes across worker counts and bounds (C1). Fault routing, restructured for a loop that cannot mid-iterate abort: member/window faults stay #272-contained inside run_cell; non-containable faults (incl. registry writes — infrastructure, not cell pathology) latch an atomic abort flag so unstarted cells never run, and after the join the lowest document-order fault among completed cells propagates as the run's error. Nothing partial is persisted at run level on the fatal path. Property pins: determinism across thread counts and bounds (1-thread/K=1 == 8-thread/K=2), distinct live instruments never exceed K (refcounting stub runner, 8-thread pool), a dead family store is run-fatal with no partial campaign-run record, member faults stay contained under the parallel loop. E2E fixtures (previous commit) pin the CLI prose and document-order persistence across K. Verified: workspace suite green, clippy -D warnings clean. rayon enters aura-campaign under the amended C16 per-case policy (comment in Cargo.toml, mirroring aura-engine). closes #277
31 lines
1.5 KiB
TOML
31 lines
1.5 KiB
TOML
[package]
|
|
name = "aura-campaign"
|
|
edition.workspace = true
|
|
version.workspace = true
|
|
license.workspace = true
|
|
publish.workspace = true
|
|
|
|
# Deliberately NO aura-ingest / aura-std / aura-composites: harness and data
|
|
# binding enter through the one-method MemberRunner seam (src/lib.rs), so the
|
|
# deploy-condemned CLI scaffolding never becomes a library dep and a
|
|
# differently-binding consumer (playground, tests) implements the same seam.
|
|
[dependencies]
|
|
# the scalar vocabulary: params cross the MemberRunner seam as (name, Scalar) pairs.
|
|
aura-core = { path = "../aura-core" }
|
|
# RunReport (the member result type) + the sweep/walk_forward orchestration machinery.
|
|
aura-engine = { path = "../aura-engine" }
|
|
# FamilySelection — the selection-provenance type stage selections carry.
|
|
aura-analysis = { path = "../aura-analysis" }
|
|
# family + campaign-run stores and the optimize/optimize_plateau/optimize_deflated selectors.
|
|
aura-registry = { path = "../aura-registry" }
|
|
# the campaign/process document types this crate executes.
|
|
aura-research = { path = "../aura-research" }
|
|
# realization payloads derive serde (the registry per-case policy, INDEX.md).
|
|
serde = { workspace = true, features = ["derive"] }
|
|
serde_json = { workspace = true }
|
|
# rayon is admitted under the amended C16 per-case dependency policy (INDEX.md):
|
|
# the campaign cell loop fans C1-disjoint cells into the same process-global
|
|
# work-stealing pool the engine's run_indexed already uses — parallelism across
|
|
# sims, never within one. Direct versioned dep, mirroring aura-engine.
|
|
rayon = "1"
|