runner: introduce CoreExecutor box for JSON→exec; wire Gate‑C pipe to CoreExecutor. Stage‑B bundling: duplicate name Fail‑Fast + mix canary; add Core Map/String positive smokes; add Gate‑C budget opt‑in canary; docs: Exit Code Policy; apply child_env in PyVM common util.
This commit is contained in:
65
src/runner/core_executor.rs
Normal file
65
src/runner/core_executor.rs
Normal file
@ -0,0 +1,65 @@
|
||||
/*!
|
||||
* CoreExecutor — JSON v0 → Execute (boxed)
|
||||
*
|
||||
* Responsibility
|
||||
* - Single entry to execute a MIR(JSON) payload under Gate‑C/Core policy.
|
||||
* - Encapsulates: optional canonicalize, v1-bridge try, v0-parse fallback,
|
||||
* OOB strict observation, and rc mapping via MIR Interpreter.
|
||||
*
|
||||
* Notes
|
||||
* - For now, execution uses the existing MIR Interpreter runner
|
||||
* (execute_mir_module_quiet_exit). Later we can swap internals to call
|
||||
* the Core Dispatcher directly without touching callers.
|
||||
*/
|
||||
|
||||
use super::NyashRunner;
|
||||
|
||||
pub(crate) fn run_json_v0(runner: &NyashRunner, json: &str) -> i32 {
|
||||
let mut payload = json.to_string();
|
||||
|
||||
let use_core_wrapper = crate::config::env::nyvm_core_wrapper();
|
||||
let use_downconvert = crate::config::env::nyvm_v1_downconvert();
|
||||
|
||||
if use_core_wrapper || use_downconvert {
|
||||
// Best-effort canonicalize
|
||||
if let Ok(j) = crate::runner::modes::common_util::core_bridge::canonicalize_module_json(&payload) {
|
||||
payload = j;
|
||||
}
|
||||
match crate::runner::json_v1_bridge::try_parse_v1_to_module(&payload) {
|
||||
Ok(Some(module)) => {
|
||||
super::json_v0_bridge::maybe_dump_mir(&module);
|
||||
// OOB strict: reset observation flag
|
||||
crate::runner::child_env::pre_run_reset_oob_if_strict();
|
||||
let rc = runner.execute_mir_module_quiet_exit(&module);
|
||||
if crate::config::env::oob_strict_fail() && crate::runtime::observe::oob_seen() {
|
||||
eprintln!("[gate-c][oob-strict] Out-of-bounds observed → exit(1)");
|
||||
return 1;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
Ok(None) => { /* fall through to v0 */ }
|
||||
Err(e) => {
|
||||
eprintln!("❌ JSON v1 bridge error: {}", e);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
match super::json_v0_bridge::parse_json_v0_to_module(&payload) {
|
||||
Ok(module) => {
|
||||
super::json_v0_bridge::maybe_dump_mir(&module);
|
||||
crate::runner::child_env::pre_run_reset_oob_if_strict();
|
||||
let rc = runner.execute_mir_module_quiet_exit(&module);
|
||||
if crate::config::env::oob_strict_fail() && crate::runtime::observe::oob_seen() {
|
||||
eprintln!("[gate-c][oob-strict] Out-of-bounds observed → exit(1)");
|
||||
return 1;
|
||||
}
|
||||
rc
|
||||
}
|
||||
Err(e) => {
|
||||
eprintln!("❌ JSON v0 bridge error: {}", e);
|
||||
1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user