8000 Inconsistent max-iterations unlimited semantics between Ralph and Willie · Issue #25 · dominicnunez/springfield · GitHub
[go: up one dir, main page]

Skip to content

Inconsistent max-iterations unlimited semantics between Ralph and Willie #25

Open

Description

@dominicnunez

Summary

max-iterations unlimited semantics are inconsistent between Ralph/run and Willie/audit.

Current behavior

From code inspection and local CLI behavior:

  • Ralph/run appears to support -1 as unlimited.
    • cli/src/cli/commands/run.ts checks config.maxIterations === -1 and loops while config.maxIterations === -1 || iteration < config.maxIterations.
  • Willie/audit documents 0 as unlimited.
    • sfk audit --help says --max-iterations <n>: Maximum audit iterations (0 = unlimited).
    • README/config example also shows [willie] max-iterations = 0.
  • Config validation rejects [willie] max-iterations = -1 with:
    • willie.max-iterations must be an integer >= 0.

Repro

Use this config fragment:

[engine]
type = codex

[models]
codex = gpt-5.5
effort = high

[willie]
max-iterations = -1
push-after-fix = true

Then run from a target repo:

sfk audit .

Observed result:

[ERROR] SFK needs a complete config before it can run.
...
Missing or invalid settings:
- willie.max-iterations must be an integer >= 0.
- willie.max-iterations is required.

Why this is confusing

Users can reasonably assume max-iterations has the same sentinel value across agents/commands. If Ralph uses -1 for unlimited but Willie uses 0, the config surface is surprising and easy to misconfigure.

Suggested fix

Pick one convention and apply it consistently across docs, config validation, CLI help, and runtime behavior.

Options:

  1. Standardize on 0 = unlimited everywhere
    • Update Ralph/run validation and docs to stop using -1.
  2. Standardize on -1 = unlimited everywhere
    • Update Willie/audit validation and docs to accept/use -1.
  3. Accept both 0 and -1 for unlimited
    • Easiest migration path, but slightly less clean long-term.

My preference: accept both temporarily, document one canonical value, then remove the non-canonical sentinel in a later breaking release if desired.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      0