You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This repo already has a proven, exact precedent for "run in observe/dry-run mode instead of live" at the maintainer-action layer: resolveAgentActionMode (src/settings/agent-execution.ts:38-42) resolves an AgentActionMode of "paused" | "dry_run" | "live" (type at line 23) from a global kill-switch plus per-repo config, deny-toward-safety (paused beats dry_run beats live), and agentActionModeExecutes (:46-48) is the single boolean check every caller uses to decide whether to actually mutate GitHub or just log what it would have done. src/settings/autonomy.ts's graduated AUTONOMY_LEVELS dial (observe/suggest/propose/auto_with_approval/auto, line 5) is the sibling per-action-class version of the same "how much is this allowed to actually do" question. A CodingAgentDriver invocation (#4262) needs the same escape hatch: run the driver in a mode where it reports what it WOULD do (or actually runs but every downstream effect is suppressed) without truly letting a coding agent loose.
Deliverables
A dry-run mode on the CodingAgentDriver interface (feat(miner-hands): define the CodingAgentDriver interface seam #4262) or its invocation call site, structurally mirroring AgentActionMode's three-state shape (src/settings/agent-execution.ts:23) — decide whether coding-agent dry-run needs the same three states (paused/dry_run/live) or just a boolean, and justify the choice against the existing three-state precedent rather than picking arbitrarily.
Precise semantics for what "dry-run" means for a CODING agent specifically (harder than the existing GitHub-mutation case, which just skips an API call): does dry-run mean the driver never spawns/queries the underlying agent at all (pure no-op, cheapest, least informative), or does it let the agent run and edit files inside its worktree (feat(miner-hands): git-worktree-per-attempt isolation primitive #4269) but suppress everything AFTER that (no commit, no push, no PR) so the edits themselves are still inspectable? Pick one, document the tradeoff, and make sure the choice is legible in the attempt log (feat(miner-hands): driver-level structured attempt log (JSONL event trace per attempt) #4294).
Tests mirroring resolveAgentActionMode's existing test bar (src/settings/agent-execution.ts:38-42's precedence rules: global pause beats per-repo dry-run beats live) adapted to whatever state shape this issue settles on.
References
src/settings/agent-execution.ts:22-48 (AgentActionMode, isGlobalAgentPause, resolveAgentActionMode, agentActionModeExecutes — the exact precedent this mirrors)
src/settings/autonomy.ts:5,25-32 (AUTONOMY_LEVELS, resolveAutonomy, isActingAutonomyLevel — the sibling graduated-autonomy dial)
packages/gittensory-engine/src/plan-templates.ts:84 (the coding-agent plan step this mode needs to be visible at)
This repo already has a proven, exact precedent for "run in observe/dry-run mode instead of live" at the maintainer-action layer:
resolveAgentActionMode(src/settings/agent-execution.ts:38-42) resolves anAgentActionModeof"paused" | "dry_run" | "live"(type at line 23) from a global kill-switch plus per-repo config, deny-toward-safety (pausedbeatsdry_runbeatslive), andagentActionModeExecutes(:46-48) is the single boolean check every caller uses to decide whether to actually mutate GitHub or just log what it would have done.src/settings/autonomy.ts's graduatedAUTONOMY_LEVELSdial (observe/suggest/propose/auto_with_approval/auto, line 5) is the sibling per-action-class version of the same "how much is this allowed to actually do" question. ACodingAgentDriverinvocation (#4262) needs the same escape hatch: run the driver in a mode where it reports what it WOULD do (or actually runs but every downstream effect is suppressed) without truly letting a coding agent loose.Deliverables
CodingAgentDriverinterface (feat(miner-hands): define the CodingAgentDriver interface seam #4262) or its invocation call site, structurally mirroringAgentActionMode's three-state shape (src/settings/agent-execution.ts:23) — decide whether coding-agent dry-run needs the same three states (paused/dry_run/live) or just a boolean, and justify the choice against the existing three-state precedent rather than picking arbitrarily.coding-agentstep (packages/gittensory-engine/src/plan-templates.ts:84) so a dry-run attempt is distinguishable end-to-end, not just at the driver's own boundary.resolveAgentActionMode's existing test bar (src/settings/agent-execution.ts:38-42's precedence rules: global pause beats per-repo dry-run beats live) adapted to whatever state shape this issue settles on.References
src/settings/agent-execution.ts:22-48(AgentActionMode,isGlobalAgentPause,resolveAgentActionMode,agentActionModeExecutes— the exact precedent this mirrors)src/settings/autonomy.ts:5,25-32(AUTONOMY_LEVELS,resolveAutonomy,isActingAutonomyLevel— the sibling graduated-autonomy dial)packages/gittensory-engine/src/plan-templates.ts:84(thecoding-agentplan step this mode needs to be visible at)