LLM API error handling in AgentLoop — litellm.acompletion() exceptions are now caught and returned as [LLM error: ...] strings instead of propagating unhandled to the caller
AST structural test upgraded — test_execute_tool_call_only_uses_submit now uses proper ast.parse() inspection per v2.2 §6.2 (was source string matching), verifying exactly one _submit call and no forbidden execution calls
agent_loop.unexpected_finish — warning for non-stop finish reasons
submit parameter on run_agent_loop() — convenience API now supports ReversibleActionLayer integration without requiring manual AgentLoop construction
ReversibleActionLayer integration test — test_agent_loop_with_reversible_layer wires AgentLoop with real ReversibleActionLayer.submit override, completing v2.2 §8.4 test coverage
Best-effort error handling in ReversibleActionLayer — strategy.capture() and store.save() failures now degrade gracefully per design §7.1-7.2 instead of crashing the submit flow
CLAUDE.md stale reference — removed outdated "OpenAI Agents SDK" requirement, updated to reflect kernel-native agent loop with LiteLLM
SnapshotStore JSON schema aligned with v2.1 design: original_request key (was request), ISO 8601 created_at (was float), expires_at field added. Backward-compatible loading of legacy format.
record_id log gap documented — Record.record_id and ActionResult.record_id docstrings clarify that log-to-snapshot correlation is caller-side only (kernel unchanged per v2.1 principle)
Replaced OpenAI Agents SDK with kernel-native agent loop — @kernel_tool, create_kernel_agent(), and run_agent() are removed. Use ToolDef + AgentLoop instead. See migration guide in docs/research/plans/2026-03-27-kernel-native-agent-loop.md.
Dependency change — openai-agents>=0.13 replaced with litellm>=1.40
AgentLoop — kernel-native agent loop where kernel.submit() is the sole execution path. No wrapper, no decorator, no opt-in. Structural enforcement of "all access through Gate" invariant.
ToolDef — declarative tool definitions containing only metadata (name, description, parameters, action, target mapping). Zero execution logic.
run_agent_loop() — convenience function for one-shot agent execution
test_agent_denied_write_outside_policy: test was prompting agent to write to /etc/passwd which triggered LLM safety refusal without calling the tool; switched to an in-workspace but policy-excluded path and asserts on the kernel log (the authoritative invariant) rather than LLM text
test_agent_exec_process_tool: args: list produced JSON schema without items, rejected by OpenAI API with 400; changed to args: list[str] | None = None
Assertion normalization: handle space-separated output from LLM echo responses
kernel_tool wrapper — fixed function signature to match OpenAI Agents SDK's
on_invoke_tool(ctx, args_json_string) contract (was incorrectly using **kwargs)