Skip to content

codeaf do "" runs a paid job with an empty brief #1566

Description

@santoshkumarradha

Seen on: dev 837b2b0.

Behaviour

codeaf do "" (one empty argument) starts a real, paid run. It exited 0 with stop:"done" and spent $0.057; the crew invented a goal from the repository (it fixed the failing tests). A missing brief should be refused the way a terminal with no piped text is refused, with nothing spent.

Replication

  1. Build dev 837b2b0 (git checkout 837b2b0 && make build, binary bin/codeaf), or install the dev build with curl -fsSL https://agentfield.ai/get/devaf | bash.
  2. Use an isolated profile: export HOME=$(mktemp -d), export OPENROUTER_API_KEY, and keep the default model (~deepseek/deepseek-v4-flash-latest, crew on auto).
  3. On a busy machine set task.max_load to 0 (/settings, Tasks) so the busy-machine gate does not hold tasks.
  4. Make a small repo with a failing test: R=$(mktemp -d) && cd "$R" && git init -q && printf 'package main\n\nfunc main() {}\n' > main.go && printf 'module demo\n\ngo 1.22\n' > go.mod && git add -A && git commit -qm init, then add any failing _test.go file and commit it.
  5. Run codeaf do "" --json; echo exit=$?.
  6. Read the JSON: stop is done, spend_usd is non-zero, and git status shows edits nobody asked for.

Evidence

  • JSON record: "stop":"done", "spend_usd":0.057, exit 0.
  • cmd/codeaf/main.go:1101-1112 (readText): with len(args) > 0 it returns strings.TrimSpace(strings.Join(args, " ")), so one empty argument becomes an empty goal with no error. The noGoalGiven check (main.go:1109, :1121, :1126) runs only on the no-argument and piped paths.

Guessed cause

A guess from reading the code, not a confirmed diagnosis. readText never checks the trimmed argument text for emptiness, so an empty brief reaches the crew and the planner fills the gap from the repository.

Acceptance

  • e2e: codeaf do "" and codeaf do " " exit non-zero with the same one-line usage as codeaf do with no argument, and no usage row is written (codeaf logs shows no call).
  • Unit: readText returns the noGoalGiven error for an all-blank argument list.

Found while writing the public docs; manual text differences are in #1545.

🤖 Generated with Claude Code

No activity

Activity on this issue will appear here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

area:headlesscodeaf do and codeaf exec, runs with no screenbugSomething the code does that it should notsev:criticalData loss, money spent wrongly, a false done, or the merge queue blocked

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions