BigPizzaV3/CodexPlusPlus · error
Unsupported native runtime component
Error message
Unsupported native runtime component: {file} What it means
Before patching, prepare() verifies every file listed in the RuntimeContract by comparing its SHA-256 against the expected hash. If any component's hash differs, the runtime does not match the known-good build Codex++ supports (wrong version, corrupted download, or previously modified file), and patching is refused, naming the offending file.
Solutions
- Delete the affected runtime directory under the runtime root and let Codex++/the plugin re-download it so hashes match the contract
- Reinstall the plugin at the version matching the current RuntimeContract (or upgrade Codex++ so its contract matches the new runtime)
- Verify no antivirus/sync tool is modifying files in the runtime cache and restore from a clean source
Defensive patterns
Strategy: retry
Validate before calling
for (file, expected) in &contract.files {
let actual = sha(&read_regular(&runtime.join(file), 128 * 1024 * 1024)?);
if actual != *expected { eprintln!("runtime file {file} hash mismatch; reinstall needed"); }
} Try / catch
if let Err(e) = prepare(&paths, &key, &contract) {
if e.to_string().starts_with("Unsupported native runtime component") {
remove_runtime_dir(&runtime)?; // delete the corrupt/mismatched runtime
redownload_runtime(&key)?; // let the plugin re-fetch it
prepare(&paths, &key, &contract)?;
}
} Prevention
- Let the plugin finish downloads/upgrades before running reconcile
- Exclude runtime cache dirs from antivirus mutation and file sync
- After plugin updates, ensure Codex++'s contract version matches the new runtime
When it happens
Trigger: prepare() (via reconcile_locked) hashes runtime_root/<key>/<file> for each (file, expected) in contract.files and the digest mismatches — e.g. the plugin auto-updated the runtime underneath Codex++, a download was truncated, or an external tool modified a runtime binary.
Common situations: Plugin runtime upgrades that outpace the pinned contract; antivirus quarantining/altering files; interrupted downloads leaving corrupt node_modules; manual edits inside the runtime cache.
Understand the failure class
Background: Checksum mismatch errors: "checksum verification failed", "digest mismatch", "expected vs actual checksum" — what they mean and how to fix them — this error's family across 41 libraries.
Related errors
- Runtime changed outside Codex++
- SHA-256 校验失败
- Ambiguous runtime selection; no cache was modified
- 会话接口返回了不匹配的数据
- 会话接口返回了不匹配的数据
AI-assisted analysis of BigPizzaV3/CodexPlusPlus@b1ed92e5e4 (2026-09-19).
Data as JSON: /api/errors/f732775ba590d087.
Report an issue: GitHub.
Appendix: source
Thrown at crates/codex-plus-core/src/native_browser.rs:373
continue;
}
let data: Value = serde_json::from_slice(&read_regular(&descriptor, 1024 * 1024)?)?;
keys.insert(selected_key(&data, &paths.runtime_root)?);
}
ensure!(
keys.len() <= 1,
"Ambiguous runtime selection; no cache was modified"
);
Ok(keys.into_iter().next())
}
fn prepare(paths: &BrowserPaths, key: &str, contract: &RuntimeContract) -> Result<()> {
ensure!(key_valid(key), "Invalid runtime key");
let runtime = paths.runtime_root.join(key);
let target = runtime.join(SERVICE);
let _runtime_guards = pin_parents(&target)?;
for (file, expected) in &contract.files {
ensure!(
sha(&read_regular(&runtime.join(file), 128 * 1024 * 1024)?) == *expected,
"Unsupported native runtime component: {file}"
);
}
let mut current = read_regular(&target, MAX_SERVICE)?;
let backup_dir = paths.state_root.join(key);
plain_path(&backup_dir)?;
fs::create_dir_all(&backup_dir)?;
let _backup_guards = pin_parents(&backup_dir.join("journal.json"))?;
let backup = backup_dir.join("original.mjs");
let journal_path = backup_dir.join("journal.json");
let control = paths.state_root.join("control.json");
if journal_path.exists() {
let (journal, original, recorded_candidate) = recovery_material(paths, key, contract)?;
let candidate = transform(&original, &control, contract)?;
if current == recorded_candidate {
if candidate == recorded_candidate {
return Ok(());View on GitHub (pinned to b1ed92e5e4)