Evidence
Real consumer run: voku/httpful#34, docs/agents/agent-loop-findings.md finding B4.
Current WorkflowPlanCommand accepts --by as a separate arbitrary non-empty argument, then renders:
agent-loop workflow approve <TASK> --by <ACTOR>
by raw string interpolation. An actor such as Claude (Opus) therefore produces a next command that is not copy/paste-safe in a shell.
Problem
Actionable CLI output is part of the workflow front door. If the tool prints a command that does not reproduce the accepted value, agents either fail or invent their own quoting.
Narrow goal
Render actionable next-command arguments losslessly and shell-safely.
Acceptance criteria
workflow plan --by 'Claude (Opus)' prints a next command that passes the exact same actor value when executed in the documented shell environment.
- Simple safe values remain readable; quoting does not need to be gratuitous.
- Add regression cases for whitespace, parentheses, a single quote, and shell metacharacters.
- Centralize command-argument rendering only if a second real caller exists or the existing code already has an owner; do not add a generic command-builder framework for one line.
- This changes presentation only. Workflow actor identity/storage semantics remain untouched.
Evidence
Real consumer run: voku/httpful#34,
docs/agents/agent-loop-findings.mdfinding B4.Current
WorkflowPlanCommandaccepts--byas a separate arbitrary non-empty argument, then renders:by raw string interpolation. An actor such as
Claude (Opus)therefore produces a next command that is not copy/paste-safe in a shell.Problem
Actionable CLI output is part of the workflow front door. If the tool prints a command that does not reproduce the accepted value, agents either fail or invent their own quoting.
Narrow goal
Render actionable next-command arguments losslessly and shell-safely.
Acceptance criteria
workflow plan --by 'Claude (Opus)'prints a next command that passes the exact same actor value when executed in the documented shell environment.