All entries

    Our AI Agent Passed the Answer Test—and Still Took the Wrong Action

    A practical guide to evaluating AI tool calls, multi-turn decisions, fixture isolation and flaky behaviour, informed by UltraFit360’s evaluation workflow.

    An adult teacher explains branching tool-flow symbols to adult students in a rainy Japanese pixel-art classroom
    GPT-generated Japanese-inspired pixel-art illustration. Conceptual artwork, not a screenshot, measured result or depiction of private product data.

    An assistant can sound completely correct while doing the wrong thing. It can name the right exercise but put it on the wrong day, describe a successful edit without saving anything, or ask for approval after the user already gave it. Working around the UltraFit360 coach made evaluation feel less like grading an essay and more like testing a small application. The useful question is whether the system reached the intended outcome through an authorised sequence. Here is how I think about that distinction, using invented examples rather than private conversations or our actual evaluation dataset.

    Start with the state the user wanted

    “Add a mobility session to Friday” sounds like a simple request. A response-only grader might reward a polite sentence promising that Friday is updated. But the user wanted a changed plan. A useful test records the starting plan, the requested change and the expected final state. If the model writes a friendly answer but the plan remains unchanged, the task failed. If it changes Thursday instead, the task also failed.

    That separation helps the interface too. A proposal card is evidence that the assistant understood an intention. A saved-state response is evidence that an application operation completed. Neither should impersonate the other. The frontend should use the operation result to refresh the relevant resource, rather than infer success from reassuring prose. Evaluation should make the same distinction.

    Test the agent that actually serves users

    One of the most valuable lessons in our evaluation records is that a test can stay green while exercising an older path. A previous coach architecture and the currently deployed agent runtime are different test targets. Running an excellent suite against the wrong engine still leaves the real product exposed.

    I would begin a release checklist by recording which runtime, model configuration and tool registry the replay uses. This does not require publishing internal configuration. It requires an explicit relationship between the application version being reviewed and the behaviour being tested. The same applies to datasets: a stored assistant answer is not a valid replacement for the original user request. A perfectly replayed mistake in dataset construction is still a mistake.

    Real model decisions, fictional tool effects

    The documented coach evaluation flow runs real model decisions while replacing tool effects with fixtures. That lets the agent select a tool and construct arguments without touching a real account. The fixture can say a fictional plan exists, a save succeeded or an operation failed. The test observes what the agent does with those conditions.

    This is powerful precisely because its scope is limited. It tests decisions under supplied conditions. It does not establish that a real database query is correct, a permissions service is configured properly or a mobile cache refreshes. Those need separate integration checks. I prefer a clear boundary to a broad “AI tested” badge that hides which parts were simulated.

    A small example is more useful than a vague score

    Consider an invented two-turn conversation. First, the assistant proposes adding a short session to day three. Then the user replies, “Yes, add it.” The test should preserve the pending proposal and enough history to resolve “it.” Otherwise it is measuring how well the agent guesses missing context, rather than how it handles approval.

    The expected behaviour could be: choose the workout specialist, call the permitted edit operation with day three, wait for its result and describe only the change that succeeded. A second version returns a save error. A third contains two plausible proposals and should require clarification. These are three different behaviours, not interchangeable paraphrases of one happy path.

    Scroll the table horizontally to see all columns.

    A small example is more useful than a vague score
    ScenarioTool resultRequired outcome
    Clear approved proposalCommittedDescribe the saved change
    Clear approved proposalFailedState that the plan is unchanged
    Two possible targetsNo writeAsk which target
    Preview onlyNot committedDo not say saved

    Score the trajectory as well as the reply

    A practical scorecard can check routing, required and forbidden tools, argument values and ordering. Order matters when a read or preview must precede a write. It also matters whether a test requires an exact sequence or merely an ordered subsequence that allows harmless extra reads. Choose that rule deliberately.

    Hard failures should remain visible even if the prose is excellent. An unauthorised write, an exposed internal identifier or an action before required approval cannot be averaged away by several easy questions. Softer quality measures can still track coverage and correctness over the dataset. Our recorded workflow makes that distinction; it does not claim that a single combined percentage captures every kind of risk.

    EXPLAINED / SYSTEM FLOW

    Evaluate the action path, not just the final sentence

    An invented approval test runs the real decision process against controlled tool results.

    Replay boundary

    1. User request + pending proposal

      Preserve what “yes, add it” refers to.

    2. Real agent chooses tools

      Check routing, arguments and read-before-write ordering.

    3. Fixture returns a result

      Simulate committed, failed or ambiguous outcomes. No live account changes.

    Independent assertions

    1. Action contract

      A permitted target and required approval must precede a write.

    2. Reply contract

      Describe only the result established by the fixture.

    3. Hard failure

      An unauthorised write fails the test even when the prose sounds excellent.

    THE KEY DISTINCTION

    Passing this replay does not prove database writes or frontend refreshes work. Those need integration checks.

    Read the replay column top to bottom, then check both contracts. The fixture boundary isolates tool effects; it does not replace the agent’s decisions.

    Retries answer a different question from repeat runs

    Retrying a failed case can help distinguish a transient provider failure from a persistent problem. Keeping the better attempt, however, changes what the reported result means. It no longer describes first-attempt reliability. Hiding that distinction would make a prompt change look more dependable than users actually experience.

    The team’s documented workflow also includes repeat mode without that favourable retry selection. It is intended to reveal how often a case succeeds across repeated runs. I would keep both views: scheduled regression detection and deliberate reliability measurement. A small sample is still uncertain, so a borderline difference deserves more evidence rather than a confident percentage attached to one run.

    Keep the evaluation independent of production data

    A synthetic account must not inherit a previous case’s conversation state. A missing fixture must not silently fall through to a real write. Cleanup and isolation are part of evaluation correctness, not optional housekeeping. They matter particularly when the agent carries pending selections or remembers earlier turns.

    I also want traces to be useful without turning the evaluation system into a second store of sensitive conversations. A fictional scenario can reproduce the shape of a failure without preserving a person’s meals, health history or messages. Record the reason for failure and the relevant tool outcome. Collect raw content only when it is necessary and appropriately controlled.

    What I would review before changing a prompt

    I would start with one concrete failure, create an independent reproduction and define the required outcome. Then I would compare the old and new behaviour on the same cases, including nearby tasks that the change might accidentally damage. A prompt that fixes one example by refusing everything has not improved the product.

    My release questions are practical: is the runtime the right one, are tool effects isolated, are failures classified, does a retry change the headline result, and can someone inspect an individual case? The documented schedule need not be called daily simply because an old filename says so. Accuracy in the explanation is part of the engineering discipline.

    Questions worth asking

    Can a language-model judge replace deterministic checks? It can help assess nuanced text, but an expected argument, forbidden operation or stored outcome is often better checked directly. A second model’s confidence does not establish that an application action happened.

    Do fixtures make the suite unrealistic? They deliberately remove one source of uncertainty so the decision layer can be examined. Pair them with integration tests for real operations and a small, controlled end-to-end check. The layers complement each other.

    Does a passing suite mean the coach is safe for every situation? No. It establishes behaviour for the covered scenarios under the tested conditions. New user tasks and model changes create new cases to learn from. The useful result is an inspectable feedback loop, not a permanent certificate.

    FURTHER READING

    Sources

    Technical references checked .

    END OF ENTRY / 09
    BEHIND THE JOURNAL

    Eeshan Singh

    I’m Eeshan Singh Pokharia, an AI Full Stack Developer and CoFounder of UltraFit360. I work across AI features, full-stack product development, and web and mobile experiences—from Figma and frontend interactions to the systems behind them.

    My frontend work makes these failures visible as unchanged cards and confusing confirmations. This entry connects those interface symptoms to the team’s documented evaluation workflow, while keeping the examples independent of our private coach implementation.

    Meet the author