The Problem
Each agentic CLI has its own safety controls with different defaults. Without coordination, some providers work out of the box while others block on preconditions that users donβt expect:
A user switching from Claude to Codex hits a wall on the simplest task β βcreate a fileβ β with no obvious fix.
AgentClientMode
AgentClientMode is a portable enum that controls default permissiveness across all providers:
LOOSE β optimized for evaluation and development, where friction during onboarding is the primary failure mode.
What Each Mode Does
- LOOSE (default)
- STRICT
Permissive defaults that minimize preconditions:
Configuration
Set the mode via Spring properties:Precedence Rules
Options are resolved in this order (first wins):- Explicit goal options β passed at call time via
AgentClient.run(goal, options) - Builder defaults β set on
AgentClient.builder().defaultOptions() - Spring properties β provider-specific values in
application.yml - Mode-derived defaults β LOOSE or STRICT baseline
- Hardcoded defaults β built into each providerβs options class
STRICT Is a Baseline, Not a Lock
Explicit property overrides always take precedence over mode-derived defaults:SDK Layer Stays Neutral
The mode system operates at the agent-models layer, not the SDK layer. Provider SDKs (codex-cli-sdk, claude-agent-sdk, gemini-cli-sdk) always reflect their CLIβs native defaults. Direct SDK consumers are never affected by AgentClientMode.
This means:
ExecuteOptions.builder().build()βskipGitCheck=false(Codex CLI native default)CodexAgentPropertieswithmode=LOOSEβisSkipGitCheck()returnstrue(mode-derived)
Migration from Pre-0.14.0
Before 0.14.0, Codex defaulted toskipGitCheck=false. If you relied on this: