feat(microvm): the tool gate's denials and inert marker reach the mission record
deploy / test (push) Failing after 1m36s
deploy / build (push) Skipped

vm_tool_gate writes denied.jsonl for every call it refuses and an `inert`
marker each time it cannot parse its input and lets the call through. The
guest has written both since the gate existed; nothing read them out of a VM.
A denial, or a gate that had quietly stopped checking, left no trace — the
same shape the container tier closed with drain_inert on 09-14.

The executor probes both files (one exec, while /root still exists) into
VmOutcome.tool_gate; launch_microvm_phase records them on the mission as the
container tier's `gate.inert` (with the count) and `gate.denied` (one event
per refused call, the gate's own JSON as the detail). Absent gate is None,
not zero — "no gate" and "a gate that refused nothing" are different facts.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01WZb5A2kfVfjpdwSochkuHz
This commit is contained in:
Omar Sobh
2026-09-18 22:40:26 -05:00
co-authored by Claude Opus 5
parent 507d7444d1
commit 9fc904a056
3 changed files with 112 additions and 0 deletions
@@ -431,6 +431,7 @@ mod tests {
tools: Vec::new(),
rootfs: None,
cli_version: None,
tool_gate: None,
})
}
}
@@ -628,6 +629,7 @@ mod tests {
tools: Vec::new(),
rootfs: None,
cli_version: None,
tool_gate: None,
})
}
}
@@ -662,6 +664,7 @@ mod tests {
tools: Vec::new(),
rootfs: None,
cli_version: None,
tool_gate: None,
})
}
}
@@ -691,6 +694,7 @@ mod tests {
tools: Vec::new(),
rootfs: None,
cli_version: None,
tool_gate: None,
})
}
}