Operations, canaries and recovery
September 20, 2026 · View on GitHub
Activation sequence
Inspect the install plan and selected profile roots. Apply into the correct user
and execution environment. Restart or reload each harness. Complete native trust
review, especially Codex /hooks; do not bypass it. Check local shadow events
before enabling remote Jev or enforcing decisions. Decide what data may leave the
machine, supply credentials to the actual host process, then configure backend
and mode explicitly. A successful install report is not a protection certificate.
There is no universal version probe or active smoke test in doctor. Doctor
reports only policy configuration, interpreter, remote-consent presence and API-key
presence. It never prints the key, makes an API request, or marks native runtime
verification as complete. Actual binary versions and activation success must be
recorded by the operator alongside canary evidence.
Deterministic plumbing canaries
The literal JEV_SENTINEL_TEST_BLOCK is an intentional diagnostic trigger. It is
not a real attack classifier benchmark. Use a disposable session and harmless
commands only. Do not add real secrets or destructive commands to canaries.
- In shadow mode, submit a benign prompt and a prompt containing the canary; inspect the outbox to verify that the adapter is called without interrupting work.
- In enforce mode, ask for a harmless
echo JEV_SENTINEL_TEST_BLOCK. An ingress gate may stop the prompt first. For an independent pre-tool check, temporarily add the exact shell tool name reported by that host todenied_tools, then ask for a plain harmless echo. It must not run. Revert the policy afterward. - Put an injection-looking test string in a disposable local fixture, then ask the agent to read it. On transformation-capable adapters, verify the replacement rather than the fixture text reaches model-visible output. On observer-only adapters, expect an incident and, when session identity is available, a latch restricting subsequent tools—not retroactive removal of the result.
For example, the shared stdin test (not a native activation test) is:
python "$HOME/.jev-sentinel/runtime/launch.py" check \
< examples/tool-before.json
The JSON should contain decision BLOCK; enforced reflects current policy. A zero
exit code alone is never an allow signal. Deleting a local fixture or starting a
new isolated test session is safer than resetting a production latch during tests.
Canary outcomes depend on the hook actually loading, the host tool path, native
approval mode, and other installed plugins. Test each profile separately.
Policy and escalation
The policy is explicit JSON in the state directory. Use the policy subcommand
for mode/backend/model changes; edit other known fields deliberately and validate
with doctor. Unknown policy keys are errors. There is no input-controlled policy
file path, endpoint, threshold, override, or allowed-tool list.
denied_tools is a global exact-name denial list. read_only_tools is an initially
empty map from harness name to exact tool names exempted from the taint latch.
Do not label a general shell, a tool that returns secrets, or a mutating multi-mode
tool read-only. Tool-name classification cannot replace argument/destination
validation and ordinary capabilities. When a session is tainted, all tools are
sensitive by default. This may prevent the original task continuing until review.
require_goal_for_sensitive_actions=true requires an available user-goal snapshot.
This will deliberately deny sensitive calls in adapters that do not capture an
authenticated ingress goal. It is a deployment choice, not an automatic fix for
missing provenance. Goals are semantic evidence, not independently proven consent.
After resolving an incident, a trusted operator may remove a latch and its goal:
python "$HOME/.jev-sentinel/runtime/launch.py" clear-session \
--session-ref HASH_FROM_OUTBOX --confirm
Use the complete 64-character session reference. This does not replay an action, grant tool permissions, or clear pending audit events. The next operation still passes its semantic and native authorization checks. Do not allow a model to call this administrative interface as a normal tool.
A read-only security reviewer can consume outbox or an explicitly configured
webhook. Its job is to propose an explanation or a safer action. Do not expose API
keys, administrator mail, arbitrary shell, unrestricted egress or permission-editing
APIs to that reviewer. examples/custom_host.py provides a callback integration
pattern without silently spawning a privileged agent.
Restore and interrupted transactions
Normal uninstall preflights every tracked path and original backup. Any changed or missing managed file aborts before restoration. A successful uninstall restores original file bytes and removes files that were originally absent. It intentionally leaves policy, audit data, private backups and some empty directories. Remove those manually only after retention/recovery requirements have been considered.
If installation is interrupted, stop the affected harnesses and inspect
transaction.json, transaction-backups/, backups/, install-manifest.json, and
any install.lock. Preserve copies with private permissions. Check the recorded
before/after SHA-256 values against current files; do not restore a file with an
unexpected current hash or discard later user edits. A native Hermes enable may
have changed configuration before its result was observed, so an unknown after
hash requires manual inspection. Lock files are not automatically considered stale.
There is deliberately no unsafe force-uninstall or force-recovery switch.
If a caught exception restored all known files, the temporary journal is removed. If restoration conflicts with concurrent edits, recovery evidence remains. A native CLI may create unrelated state outside the tracked config file; that state is not claimed to be transactionally restored. Restart/reload the host after recovery.
Deployment beyond one user
Repeat installation in each container, server or account, using explicit roots
and separate state directories as required. Do not mount an unrestricted writable
security control plane into the same container that executes arbitrary agent code.
For strict isolation, keep policy/runtime/config read-only to the agent and perform
sensitive operations through a separately authenticated broker. This package does
not provision that broker, managed policy, native sandbox, network restrictions,
service supervision or an agent fleet manager. It also does not bypass cloud hooks
or silently alter /compact, /prune, permissions, memory policy or model settings.