Skip to content

bug(orchestrator): subagent handoffs paraphrase the user's request, so ODD loses requirements and verify is ungrounded #1713

Closed

Description

@Alan-TheGentleman

Before submitting

  • I searched open and closed issues and did not find a report of this problem.
  • I reviewed this report and removed credentials, tokens, private paths, hostnames, and other sensitive data.

Problem

In ODD work with delegation, the orchestrator loses the user's requirements on the way to its subagents, and nothing downstream recovers them. The result is a worse outcome than a single agent with the same model and the same prompt.

ODD is meant to replace SDD by removing bureaucracy while improving result quality: an organic flow where the feature document is a living log, and corrections are appended to it instead of re-running a whole process. That only works if the log and the handoffs carry the real requirements. Today they carry a paraphrase.

Observed in a controlled benchmark run (same model openai-codex/gpt-6-luna at medium, same 73-line feature prompt with 11 numbered rules, exact error strings and console examples, same hidden acceptance suite of 26 checks):

  • A single vanilla agent kept the full prompt in context and passed 26/26 on the first attempt.
  • gentle-pi (orchestrator + explore/worker/verify, all on the same model) never passed: 13 failing after the first attempt, 3 still failing after two rounds of user feedback.

Root cause, from the session and task records:

  1. Handoffs paraphrase the spec. Every worker and verify handoff was a summary of under 1.6k characters (the prompt is about 4.5k). Exact output strings, error messages, examples and one whole rule were dropped. Each re-prompt after a harness rejection got shorter (1786 -> 1542 -> 963 characters).
  2. The ODD feature document replaces the spec with a lossy summary. The task file held six summarized bullets, no exact strings and no examples, and it introduced a requirement that was never asked for. Workers were told to treat that file as the spec, so it overrode the user's prompt.
  3. Verify is not grounded in the requirements. Every verify pass only re-ran the worker's own tests and read code. It never executed the prompt's console examples, never saw the prompt, and reported "No findings" while three acceptance requirements were still unmet. It also flagged a phantom gap that came from the distorted ODD document.
  4. Feedback is dismissed without reproduction. When the user reported failing behaviors, the orchestrator concluded from reading code that some of them "already work" and did not run the reported example. Those were real failures (a case-insensitive filter that was case-sensitive, and two wrong error texts).
  5. Handoff format friction shrinks prompts. Two worker launches were rejected for a malformed ## Allowed edit surfaces section and one subagent_continue used an invalid task id; every retry produced a shorter handoff.

Every one of the final failures traces to an exact string, example or rule that was present in the user prompt and absent from every handoff. The same model solved it when it could read the prompt.

Related: #1494 (disproportionate ODD overhead on small fixes) — that issue is about cost; this one is about losing quality.

Steps to reproduce

  1. Start gentle-pi with every agent routed to one small model (for example gpt-6-luna at medium) on a small multi-module TypeScript CLI repository.
  2. Give a single feature request of roughly 70 lines that contains numbered rules, exact error messages to print, and console examples of expected output.
  3. Let ODD create the feature document and delegate explore, worker and verify.
  4. Inspect the subagent task records (gentle-agents/tasks/*.json, field task.prompt) and the ODD task file.
  5. Run the request's console examples against the result.

Synthetic fixture available on request: a ledger CLI with a "split transactions across categories" request and a hidden acceptance suite.

Expected and actual behavior

Expected

  • The user's request travels verbatim (or by an explicit reference to an immutable copy) to every worker and verify handoff. Summaries may be added for orientation, never as a replacement.
  • The ODD feature document copies the user's requirements verbatim, including exact strings and examples, as the source of truth; tasks and corrections are appended to that log, keeping the flow organic rather than restarting a process.
  • Verify checks the change against the user's requirements: it executes the stated examples and compares exact outputs, not only the worker's own tests.
  • When the user reports a failing behavior, the orchestrator reproduces it before deciding it already works.
  • A rejected handoff is fixed and resent with the same content, never re-summarized shorter.

Actual

  • Worker and verify receive paraphrases of under 1.6k characters; exact strings, examples and a whole rule are lost.
  • The ODD document holds a lossy summary that replaces the prompt and adds an unrequested requirement.
  • Verify reports "No findings" with unmet requirements.
  • Reported failures are dismissed from code reading.
  • With the same model and prompt, a single vanilla agent passes 26/26 at the first attempt; gentle-pi never passes.

Suggested direction, keeping ODD lightweight (no new mandatory phases or ceremony):

  1. Persist the original request verbatim in the feature document (or alongside it) and reference it from every handoff.
  2. Require handoffs to include the verbatim requirements section, with an optional short summary on top.
  3. Ground verify in the requirements: run the request's examples and check exact strings; report requirement-by-requirement coverage.
  4. On user-reported failures, reproduce first; never dismiss from inspection alone.
  5. On handoff rejection, repair the format without shortening the content.

gentle-pi version

4.0.0

Pi version

1.0.0

Operating system

Linux

Relevant logs or error output (optional)

worker handoff length (chars): 1786 (rejected: malformed "## Allowed edit surfaces") -> 1542 -> 963
user prompt length (chars):    ~4500 (73 lines, rules 1-11, exact error strings, console examples)
verify result (final round):   "No findings" (worker tests 32/32 passing)
hidden acceptance (final):     23/26 passing after 2 feedback rounds
single vanilla agent, same model and prompt: 26/26 on first attempt

Activity

  1. Alan-TheGentleman commented on Oct 3, 2026

    @Alan-TheGentleman
    CollaboratorAuthor

    Proposed design for point 1: the feature document is the spec, handoffs pass a reference

    Instead of re-writing the request into each handoff, put the user's request verbatim in the ODD feature document and have every subagent read it from there. This keeps ODD organic (one file that already exists, used as the source of truth instead of as a summary) and removes the paraphrase step where requirements get lost.

    Layout of odd/tasks/<feature>.md

    ## Summary            <- optional, short orientation; never authoritative
    ## Original request   <- verbatim user request, exact strings and examples; immutable
    ## Requirement changes <- append-only entries: "YYYY-MM-DD: <change, verbatim from the user>"
    ## Tasks / log        <- the existing living log: tasks, decisions, evidence, corrections

    Handoff contract

    A worker or verify handoff becomes a few lines, for example:

    Spec: odd/tasks/split-transactions.md -> "Original request" + "Requirement changes" (authoritative).
    Your scope: T2 (CSV import/export of split lines).
    Read the spec sections before any edit, then report which numbered requirements your change covers.
    

    Rules that make it work

    1. Immutable source. No agent, including the orchestrator, edits "Original request". A change of mind is appended under "Requirement changes"; the original stays for traceability.
    2. Proof of reading. Small models skip instructions, so the handoff requires reading the spec first and the result lists the requirement numbers it covered (and any it believes are out of its scope).
    3. Summary on top, never instead. The summary helps orientation; conflicts are resolved in favor of the verbatim sections.
    4. Verify reads the same sections and checks requirement by requirement, executing the request's examples and comparing exact strings, not only the worker's own tests.

    Cost effect

    • Subagent input does not shrink: the subagent still reads the full request, which is exactly what was missing.
    • Orchestrator output shrinks: no long re-written handoffs per subagent, and output tokens are the expensive ones.
    • Repeated reads of the same file by several subagents tend to hit the prompt cache.
    • The paraphrase step disappears, so there is nothing left to drop.
  2. added
    status:approvedIssue approved by maintainer; PR may be opened
    and removed on Oct 3, 2026
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

    bugSomething isn't workingstatus:approvedIssue approved by maintainer; PR may be opened

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions