Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## 2026-09-17

### Changes

- [Pilot] When the app reports an action succeeded but the record is not visible on the page, Pilot now asks
the API whether it was stored instead of failing on what the screenshot shows. A record the API cannot find
is still a failure. Needs API access configured; without it, Pilot judges from the page as before.

## 2026-09-16

### Configuration
Expand Down
14 changes: 10 additions & 4 deletions src/ai/fisherman/tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -221,13 +221,19 @@ export function createAskApiTool(fisherman: Fisherman | null, task: Test) {
return {
askApi: tool({
description: dedent`
Ask what data already exists, changing nothing.
Ask a question about existing records: which ones are there, what they are called, whether a particular one exists.
Use it before precondition() to see whether suitable data is already available, and whenever a step needs the exact name or id of a record that is already there.
Read the app's data over the API, changing nothing.
Answers questions about records: which ones are there, what they are called, whether a particular one exists.

Use it to:
- check whether suitable data already exists, before precondition() creates any
- get the exact name or id of a record a step must act on
- find out whether an action was stored, when the app reported success but the page does not show the result
- find out whether data exists at all, when a list or dropdown is empty

It never creates, edits or deletes anything — precondition() does that.
`,
inputSchema: z.object({
question: z.string().describe('What to find out about data that already exists'),
question: z.string().describe('What to find out about the data'),
}),
execute: async ({ question }) => {
tag('info').log(`Ask API: ${question}`);
Expand Down
11 changes: 8 additions & 3 deletions src/ai/pilot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1157,9 +1157,14 @@ export class Pilot implements Agent {

YOUR Pilot-only tools, both over the API:

askApi(question) — ask what data already exists. It changes nothing. Use it to check whether
suitable data is already there before creating any, and to get the exact name or id of an existing
record a step must act on.
askApi(question) — read the app's data over the API. It changes nothing. Use when:

- Before precondition() — check whether suitable data already exists.
- A step needs the exact name or id of an existing record.
- The app reported success but the page does not show the result — ask whether it was stored.
- A list or dropdown is empty — ask whether the data exists at all.

The page is not the only witness. A record missing from the page may still exist.

precondition(description) — create FRESH disposable test data. Never request users. Use when:

Expand Down
Loading