Unified Agent Tuning (internal/agentcfg)
agentcfgis the single owner of the harness-neutral model/effort surface and of the mapping down to each harness's native mechanism (claude/copilot--effort, codex-m+-c model_reasoning_effort, grok--reasoning-effort, pi--thinking, opencode's session-messagemodel/variant, acpx--modelforcursor/acp:<target>). Add a harness there, not in an adapter or in eval.rovodevandantigravityare deliberately declared unmappable, so a request for them is a config error rather than a flag that is silently ignored.agent.NewWithOptionsis the one funnel: it validatesOptions.Profileand splices the mapped args after the operator's rawagent_args_overrideargs, so both the pipeline (cfg.AgentProfileFor) and eval replay (Candidate.Profile()) reach every harness by the same path. Never re-derive a model or effort flag at a call site.- Precedence is fixed: a raw
agent_args_overrideflag that already pins a knob natively wins and the mapped value is not emitted, which is what keeps every pre-agent_configconfiguration byte-identical and stops a harness receiving one knob twice.agent_configis global-only for the same reason asagent_args_override. - Eval candidates are
agent,model=<model>[,effort=<level>](the previousagent+modelspelling is refused with a migration message), effort is part of the persisted candidate identity, andagentNeutralGlobalConfigstripsagent,agent_args_override, andagent_configso a replay never inherits the capturing machine's pins. - Regressions:
internal/agentcfg,internal/agent/profile_test.go,internal/config/config_agent_config_test.go,internal/daemon/pipeline_agent_profile_test.go,TestParseCandidate*,TestReplayPinsCandidateModelAndEffortOnTheHarness,TestCaptureStripsEveryHarnessPinFromThePinnedConfig.