From 6984068bcb3cfa33a02b908c52174616ccfb77d9 Mon Sep 17 00:00:00 2001 From: Edgar Arakelyan Date: Sun, 25 Oct 2026 11:11:06 -0700 Subject: [PATCH] docs(skill): show a UI-shaped create in the recording example The example created its object with a request step, and agents copied it even where the UI writes the fields the server needs (EspoCRM). It now fills a form and saves the id from the response the Save click triggers. A request-step write coverage withholds is recorded through the UI instead, and Basic credentials are no longer offered as a way around the UI. Co-Authored-By: Claude Opus 5.5 --- .../references/environments.md | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/.agents/skills/reverse-engineer-anything/references/environments.md b/.agents/skills/reverse-engineer-anything/references/environments.md index 32d1cf2d74..a0c3472c62 100644 --- a/.agents/skills/reverse-engineer-anything/references/environments.md +++ b/.agents/skills/reverse-engineer-anything/references/environments.md @@ -81,20 +81,28 @@ shape, with the application's own locators, paths and headers: "expected_status": [200] }, { - "step_id": "create-folder-1", - "action": "request", + "step_id": "new-folder-1", + "action": "click", "timeout_ms": 15000, - "method": "POST", - "path": "/api/folders", - "json": { "title": "Scratch folder 1" }, - "headers": [ - { - "name": "X-CSRFToken", - "value": { "source": "cookie", "name": "csrftoken" } - } - ], - "save": [{ "name": "folder_1", "json_pointer": "/id" }], - "expected_status": [200, 201] + "locator": { "kind": "role", "role": "button", "name": "New folder" } + }, + { + "step_id": "folder-title-1", + "action": "fill", + "timeout_ms": 15000, + "locator": { "kind": "css", "selector": "input[name=title]" }, + "value": { "source": "literal", "value": "Scratch folder 1" } + }, + { + "step_id": "create-folder-1", + "action": "click", + "timeout_ms": 15000, + "locator": { "kind": "role", "role": "button", "name": "Create" }, + "save_response": { + "method": "POST", + "path": "/api/folders", + "save": [{ "name": "folder_1", "json_pointer": "/id" }] + } }, { "step_id": "read-folder-1", @@ -127,8 +135,10 @@ client with it. Match `wait_for` locators to exactly one element. `request` steps instead only when the UI cannot reach the operation (an API-only resource, or a UI that does not call the JSON API), or when coverage withholds the UI-shaped write as `unexplained-change` or `contradicted`; - that counts as one of the two re-recordings. If a journey cannot be - scripted, leave the write unserved and report the limitation. + that counts as one of the two re-recordings. A `request` step write that + coverage withholds that way usually lacks fields the UI sends: record it + through the UI instead. If a journey cannot be scripted, leave the write + unserved and report the limitation. Record two numbered scratch objects per write type, with varied free text. After each write, and before the next one, read the object back by id and then its list: create 1, read 1, list, create 2, @@ -149,10 +159,9 @@ About `request` steps: base64 of `username:password` and redacted), with an optional `prefix` such as `"Bearer "` or `"Basic "`. Each credential part is a literal, secret, saved value, cookie or local storage entry, so a header the frontend builds from a - login token (the username and the token) can be copied too. An API that - takes Basic auth needs no session from the UI. Copy the - headers the application's own requests send (a CSRF header, a bearer - token). Values read from the page are redacted from records made after they + login token (the username and the token) can be copied too. Copy the + headers the application's own requests send (a CSRF header such as + `X-CSRFToken` from the `csrftoken` cookie, a bearer token). Values read from the page are redacted from records made after they are read, not from the login response that returned them, and values shorter than 8 characters are not redacted at all. - `save: [{name, json_pointer, secret}]` keeps a string or number from the