{
  "agents": [
    {
      "name": "agy",
      "display": "Antigravity CLI",
      "coverage": [
        {
          "version": "1.4.5",
          "date": "2026-10-24",
          "method": "fresh capture of 8 screens in a private tmux server, 120x40",
          "notes": "Covers the folder-trust dialog, idle, typed, busy, a command permission dialog and the AskQuestion dialog. Not checked: the file permission dialog, the model picker, the command menu, the shortcuts help."
        },
        {
          "version": "1.4.7",
          "date": "2026-10-30",
          "method": "fresh capture of 6 screens in a private tmux server, 120x40, by scenarios/agy/deny-and-tools.sh and scenarios/agy/continue.sh",
          "notes": "Covers idle, busy, the file permission dialog, the screen after \"2. No, deny creation\", the screen after Esc on the file dialog, and agy --continue in a folder with no conversation. Not checked on 1.4.7: the trust dialog, typed text, the command permission dialog, the question dialog, the model picker, the command menu, the shortcuts help."
        }
      ],
      "screens": [
        {
          "key": "agy/after-deny-v1-4-7",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/after-deny-v1-4-7.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/after-deny-v1-4-7.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/after-deny-v1-4-7.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/after-deny-v1-4-7.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.7",
            "capture": "plain",
            "description": "About 3 s after the digit 2 (\"No, deny creation\") on the file dialog. The history shows \"User declined the tool call\" and \"Interrupted · What should Antigravity CLI do instead?\", then a framed, empty box and \"? for shortcuts\". No hook fired for the deny (fact 41). The next prompt ran. Captured by scenarios/agy/deny-and-tools.sh in a private tmux server.",
            "edits": [
              "the account e-mail address is replaced with user@example.com",
              "the path of the throwaway work folder is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              41
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/after-escape-v1-4-7",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/after-escape-v1-4-7.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/after-escape-v1-4-7.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/after-escape-v1-4-7.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/after-escape-v1-4-7.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.7",
            "capture": "plain",
            "description": "About 4 s after Esc on the file dialog, at the end of a session with four turns. The last turn shows \"Interrupted · What should Antigravity CLI do instead?\", then a framed, empty box and \"? for shortcuts\". The logo and the e-mail line scrolled off the top. No hook fired for the Esc (fact 41). Captured by scenarios/agy/deny-and-tools.sh in a private tmux server.",
            "edits": [
              "the path of the throwaway work folder is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              41
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/after-question-v1-4-5",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/after-question-v1-4-5.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/after-question-v1-4-5.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/after-question-v1-4-5.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/after-question-v1-4-5.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "The turn ended after the answer \"Blue\". Captured by the ai-world project with agy 1.4.5 in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example",
              "the account e-mail address is replaced with user@example.com"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/busy-v1-4-5",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/busy-v1-4-5.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/busy-v1-4-5.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/busy-v1-4-5.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/busy-v1-4-5.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "About 2 s after the prompt was sent: \"Generating...\", a framed box, and \"esc to cancel\" in the footer. Captured by the ai-world project with agy 1.4.5 in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example",
              "the account e-mail address is replaced with user@example.com"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "BUSY"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/busy-v1-4-7",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/busy-v1-4-7.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/busy-v1-4-7.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/busy-v1-4-7.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/busy-v1-4-7.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.7",
            "capture": "plain",
            "description": "About 1.5 s after the prompt was sent: \"Generating...\" above a framed, empty box, and \"esc to cancel\" in the footer. Captured by scenarios/agy/deny-and-tools.sh in a private tmux server.",
            "edits": [
              "the account e-mail address is replaced with user@example.com",
              "the path of the throwaway work folder is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "BUSY"
            },
            "facts": [
              17,
              45
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/busy",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/busy.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/busy.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/busy.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/busy.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "A turn of agy that runs. The footer is \"esc to cancel\", the same text as under a permission dialog. The frame makes it a turn. One rule of the history has 30 characters here. The pane was 120 columns wide. The number of rows was not recorded. `tests/test_agy_screen.py::test_each_measured_screen_has_its_state` asserts the state.\n",
            "edits": [
              "each rule is shorter than on the screen (tg-bridge comment); the pane was 120 columns wide",
              "lines at the top of the pane are left out (the tg-bridge comment says the logo is left out)",
              "the spaces before the model name in the footer are fewer than on the screen, because the line is shorter; not verified"
            ],
            "expect": {
              "dialog": "none",
              "state": "BUSY"
            },
            "facts": [
              17
            ],
            "measured": "2026-10-23T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/color-scheme",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/color-scheme.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/color-scheme.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/color-scheme.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/color-scheme.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "The color scheme screen of the first start of agy. It has a mark with no frame and no numbered option, and its answer belongs to the operator. The pane was 120 columns wide. The number of rows was not recorded. `tests/test_agy_screen.py::test_each_measured_screen_has_its_state` asserts the state.\n",
            "edits": [
              "lines at the top of the pane are left out (the tg-bridge comment says the logo is left out)"
            ],
            "expect": {
              "state": "UNKNOWN"
            },
            "facts": [
              17
            ],
            "measured": "2026-10-23T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/command-menu",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/command-menu.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/command-menu.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/command-menu.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/command-menu.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "The command menu that a \"/\" typed into the box opens below the box. The pane was 120 columns wide. The number of rows was not recorded. `tests/test_agy_screen.py::test_an_overlay_below_the_box_is_not_an_idle_box` asserts the state. `tests/test_agy_screen.py::test_the_box_above_each_overlay_is_framed` shows that the same screen cut below the box reads as IDLE.\n",
            "edits": [
              "each rule is shorter than on the screen (tg-bridge comment); the pane was 120 columns wide",
              "lines at the top of the pane are left out (the tg-bridge comment says the logo is left out)",
              "the spaces before the model name in the footer are fewer than on the screen, because the line is shorter; not verified"
            ],
            "expect": {
              "state": "UNKNOWN"
            },
            "facts": [
              18
            ],
            "measured": "2026-10-24T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/continue-empty-v1-4-7",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/continue-empty-v1-4-7.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/continue-empty-v1-4-7.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/continue-empty-v1-4-7.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/continue-empty-v1-4-7.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.7",
            "capture": "plain",
            "description": "agy --continue in a work folder with no conversation, about 6 s after the start. After the edits, the bytes are the same as idle-v1-4-7: agy starts a new session and draws the normal idle box. The next prompt ran and made a new conversation, with SessionStart (fact 43). Captured by scenarios/agy/continue.sh in a private tmux server.",
            "edits": [
              "the account e-mail address is replaced with user@example.com",
              "the path of the throwaway work folder is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              43
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/file-permission-v1-4-7",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/file-permission-v1-4-7.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/file-permission-v1-4-7.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/file-permission-v1-4-7.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/file-permission-v1-4-7.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.7",
            "capture": "plain",
            "description": "A file write in the default mode. The dialog draws in place of the input box, with no frame below it. The PreToolUse hook fired before this dialog drew (fact 42). Captured by scenarios/agy/deny-and-tools.sh in a private tmux server.",
            "edits": [
              "the account e-mail address is replaced with user@example.com",
              "the path of the throwaway work folder is scrubbed to /work/example, in the header and in the path of the file"
            ],
            "expect": {
              "box_text": null,
              "dialog": "permission",
              "options": [
                {
                  "label": "Yes, allow creation",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "No, deny creation",
                  "n": 2
                }
              ],
              "question": "Allow creation of this file?",
              "state": "PERMISSION"
            },
            "facts": [
              4,
              18,
              41,
              42
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/file-permission",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/file-permission.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/file-permission.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/file-permission.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/file-permission.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "A file write in the default mode. The dialog draws in place of the input box, not above it. The pane was 120 columns wide. The number of rows was not recorded. `tests/test_agy_screen.py::test_a_dialog_that_asks_draws_in_place_of_the_box` asserts the state and that no framed box is on the screen. `tests/test_agy_screen.py::test_the_dialogs_give_the_question_that_the_chat_reads` asserts the question.\n",
            "edits": [
              "the placeholder workspace path of tg-bridge is scrubbed to /work/example",
              "each rule is shorter than on the screen (tg-bridge comment); the pane was 120 columns wide",
              "lines at the top of the pane are left out (the tg-bridge comment says the logo is left out)",
              "the spaces before the model name in the footer are fewer than on the screen, because the line is shorter; not verified"
            ],
            "expect": {
              "dialog": "permission",
              "question": "Allow creation of this file?",
              "state": "PERMISSION"
            },
            "facts": [
              4,
              18
            ],
            "measured": "2026-10-24T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/idle-v1-4-5",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/idle-v1-4-5.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/idle-v1-4-5.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/idle-v1-4-5.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/idle-v1-4-5.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "A new session after the trust dialog. Footer \"? for shortcuts\". Captured by the ai-world project with agy 1.4.5 in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example",
              "the account e-mail address is replaced with user@example.com"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/idle-v1-4-7",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/idle-v1-4-7.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/idle-v1-4-7.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/idle-v1-4-7.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/idle-v1-4-7.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.7",
            "capture": "plain",
            "description": "A new session after the wizard and the trust question, before the first prompt. A notice with a \"┃\" bar (\"Verbosity now defaults to medium\", \"esc to dismiss\") draws above the framed box. Footer \"? for shortcuts\". Captured by scenarios/agy/deny-and-tools.sh in a private tmux server.",
            "edits": [
              "the account e-mail address is replaced with user@example.com",
              "the path of the throwaway work folder is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              17
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/idle",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/idle.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/idle.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/idle.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/idle.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "An empty input box of agy. The mark is \">\", and a rule is above and below it. The pane was 120 columns wide. The number of rows was not recorded. `tests/test_agy_screen.py::test_each_measured_screen_has_its_state` asserts the state. `tests/test_agy_screen.py::test_the_box_holds_the_typed_text_and_nothing_when_empty` asserts an empty box.\n",
            "edits": [
              "each rule is shorter than on the screen (tg-bridge comment); the pane was 120 columns wide",
              "lines at the top of the pane are left out (the tg-bridge comment says the logo is left out)",
              "the spaces before the model name in the footer are fewer than on the screen, because the line is shorter; not verified"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              17
            ],
            "measured": "2026-10-23T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/model-picker",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/model-picker.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/model-picker.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/model-picker.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/model-picker.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "The /model picker. It draws BELOW a framed input box, and its cursor line starts with the mark, so the last mark is the cursor of the picker. The pane was 120 columns wide. The number of rows was not recorded. `tests/test_agy_screen.py::test_an_overlay_below_the_box_is_not_an_idle_box` asserts the state. `tests/test_agy_screen.py::test_the_box_above_each_overlay_is_framed` shows that the same screen cut below the box reads as IDLE.\n",
            "edits": [
              "each rule is shorter than on the screen (tg-bridge comment); the pane was 120 columns wide",
              "lines at the top of the pane are left out (the tg-bridge comment says the logo is left out)",
              "the spaces before the model name in the footer are fewer than on the screen, because the line is shorter; not verified"
            ],
            "expect": {
              "state": "UNKNOWN"
            },
            "facts": [
              18
            ],
            "measured": "2026-10-24T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/permission-v1-4-5",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/permission-v1-4-5.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/permission-v1-4-5.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/permission-v1-4-5.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/permission-v1-4-5.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "A command permission dialog. It draws in place of the input box. The footer still says \"esc to cancel\". Captured by the ai-world project with agy 1.4.5 in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example",
              "the account e-mail address is replaced with user@example.com"
            ],
            "expect": {
              "box_text": null,
              "dialog": "permission",
              "options": [
                {
                  "label": "Yes, run command",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Yes, and always allow in this conversation for commands that start with 'echo hello > hello.txt'",
                  "n": 2
                },
                {
                  "label": "Yes, and always allow for commands that start with 'echo hello > hello.txt' (Persist to settings.json)",
                  "n": 3
                },
                {
                  "label": "No, cancel",
                  "n": 4
                }
              ],
              "question": "Run this command?",
              "state": "PERMISSION"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/permission",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/permission.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/permission.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/permission.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/permission.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "A command permission dialog of agy. It has no frame, its mark is \">\", and a digit answers it at once. The pane was 120 columns wide. The number of rows was not recorded. `tests/test_agy_screen.py::test_each_measured_screen_has_its_state` asserts the state. `tests/test_agy_screen.py::test_the_permission_dialog_gives_its_question_and_its_options` asserts the question. That test pins the labels of options 1 and 4 only, so the options are not listed here.\n",
            "edits": [
              "each rule is shorter than on the screen (tg-bridge comment); the pane was 120 columns wide",
              "lines at the top of the pane are left out (the tg-bridge comment says the logo is left out)",
              "the spaces before the model name in the footer are fewer than on the screen, because the line is shorter; not verified"
            ],
            "expect": {
              "dialog": "permission",
              "question": "Run this command?",
              "state": "PERMISSION"
            },
            "facts": [
              4,
              17
            ],
            "measured": "2026-10-23T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/question-v1-4-5",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/question-v1-4-5.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/question-v1-4-5.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/question-v1-4-5.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/question-v1-4-5.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "The AskQuestion dialog: \"Question 1/1: ...\", in place of the box, footer \"enter Select · esc Skip\". Captured by the ai-world project with agy 1.4.5 in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example",
              "the account e-mail address is replaced with user@example.com"
            ],
            "expect": {
              "box_text": null,
              "dialog": "question",
              "options": [
                {
                  "label": "Red",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Blue",
                  "n": 2
                },
                {
                  "label": "Write-in...",
                  "n": 3
                }
              ],
              "question": "Which option do you choose?",
              "state": "PERMISSION"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/question",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/question.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/question.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/question.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/question.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "The tool of agy that asks the user a question. The dialog draws in place of the input box. The pane was 120 columns wide. The number of rows was not recorded. `tests/test_agy_screen.py::test_a_dialog_that_asks_draws_in_place_of_the_box` asserts the state and that no framed box is on the screen. `tests/test_agy_screen.py::test_the_dialogs_give_the_question_that_the_chat_reads` asserts the options.\n",
            "edits": [
              "each rule is shorter than on the screen (tg-bridge comment); the pane was 120 columns wide",
              "lines at the top of the pane are left out (the tg-bridge comment says the logo is left out)",
              "the spaces before the model name in the footer are fewer than on the screen, because the line is shorter; not verified"
            ],
            "expect": {
              "dialog": "question",
              "options": [
                {
                  "label": "Red",
                  "n": 1
                },
                {
                  "label": "Blue",
                  "n": 2
                },
                {
                  "label": "Write-in...",
                  "n": 3
                }
              ],
              "state": "PERMISSION"
            },
            "facts": [
              4,
              18
            ],
            "measured": "2026-10-24T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/running-command-v1-4-5",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/running-command-v1-4-5.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/running-command-v1-4-5.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/running-command-v1-4-5.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/running-command-v1-4-5.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "About 8 s after the approval: \"Running command...\", a framed box, and \"esc to cancel\". Captured by the ai-world project with agy 1.4.5 in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example",
              "the account e-mail address is replaced with user@example.com"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "BUSY"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/shortcuts",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/shortcuts.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/shortcuts.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/shortcuts.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/shortcuts.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "The help panel that a \"?\" typed into the empty box opens below the box. The pane was 120 columns wide. The number of rows was not recorded. `tests/test_agy_screen.py::test_an_overlay_below_the_box_is_not_an_idle_box` asserts the state. `tests/test_agy_screen.py::test_the_box_above_each_overlay_is_framed` shows that the same screen cut below the box reads as IDLE.\n",
            "edits": [
              "each rule is shorter than on the screen (tg-bridge comment); the pane was 120 columns wide",
              "lines at the top of the pane are left out (the tg-bridge comment says the logo is left out)",
              "the spaces before the model name in the footer are fewer than on the screen, because the line is shorter; not verified"
            ],
            "expect": {
              "state": "UNKNOWN"
            },
            "facts": [
              18
            ],
            "measured": "2026-10-24T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/terms",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/terms.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/terms.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/terms.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/terms.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "The terms of service screen of the first start of agy. Its answers accept terms, so a tool must read it as a screen it does not know and send no key. The pane was 120 columns wide. The number of rows was not recorded. `tests/test_agy_screen.py::test_each_measured_screen_has_its_state` asserts the state.\n",
            "edits": [
              "the rule of dashes may be shorter than on the screen; not verified",
              "lines at the top of the pane are left out (the tg-bridge comment says the logo is left out)"
            ],
            "expect": {
              "state": "UNKNOWN"
            },
            "facts": [
              17
            ],
            "measured": "2026-10-23T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/trust-v1-4-5",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/trust-v1-4-5.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/trust-v1-4-5.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/trust-v1-4-5.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/trust-v1-4-5.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "The folder-trust dialog of a new folder. The mark \">\" starts on \"Yes\". The options have no numbers. Captured by the ai-world project with agy 1.4.5 in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "trust",
              "options": [
                {
                  "label": "Yes, I trust this folder",
                  "selected": true
                },
                {
                  "label": "No, exit"
                }
              ],
              "question": "Do you trust the contents of this project?",
              "state": "TRUST"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/trust",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/trust.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/trust.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/trust.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/trust.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "The folder-trust menu of agy. It starts on \"Yes, I trust this folder\", which is the opposite of Claude Code 2.1.251. The pane was 120 columns wide. The number of rows was not recorded. `tests/test_agy_screen.py::test_each_measured_screen_has_its_state` asserts the state. `tests/test_agy_screen.py::test_the_trust_menu_starts_on_the_option_that_accepts` pins the mark on the accept option.\n",
            "edits": [
              "the placeholder workspace path of tg-bridge is scrubbed to /work/example",
              "lines at the top of the pane are left out (the tg-bridge comment says the logo is left out)"
            ],
            "expect": {
              "dialog": "trust",
              "options": [
                {
                  "label": "Yes, I trust this folder",
                  "selected": true
                },
                {
                  "label": "No, exit"
                }
              ],
              "state": "TRUST"
            },
            "facts": [
              10,
              17
            ],
            "measured": "2026-10-23T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/typed-v1-4-5",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/typed-v1-4-5.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/typed-v1-4-5.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/typed-v1-4-5.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/typed-v1-4-5.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "Text typed into the box, not sent yet. Captured by the ai-world project with agy 1.4.5 in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example",
              "the account e-mail address is replaced with user@example.com"
            ],
            "expect": {
              "box_text": "Run the shell command: echo hello > hello.txt",
              "dialog": "none",
              "state": "IDLE"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "agy/typed",
          "page": "https://xsavikx.github.io/agent-signals/corpus/agy/typed.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/agy/typed.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/agy/typed.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/agy/screens/typed.yaml",
          "fields": {
            "agent": "agy",
            "agent_version": "1.4.5",
            "capture": "plain",
            "description": "A framed input box of agy that holds typed text, below an earlier message of the history that also starts with \">\". The pane was 120 columns wide. The number of rows was not recorded. `tests/test_agy_screen.py::test_each_measured_screen_has_its_state` asserts the state.\n",
            "edits": [
              "each rule is shorter than on the screen (tg-bridge comment); the pane was 120 columns wide",
              "lines at the top of the pane are left out (the tg-bridge comment says the logo is left out)",
              "the spaces before the model name in the footer are fewer than on the screen, because the line is shorter; not verified"
            ],
            "expect": {
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              17
            ],
            "measured": "2026-10-23T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "aider",
      "display": "Aider",
      "coverage": [
        {
          "version": "0.86.2",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runners ubuntu-24.04 (x64) and ubuntu-22.04-arm (arm64)",
          "notes": "Covers the git question of the first start (git-repo-question-v0-86-2), and the analytics question that ubuntu-22.04-arm gave in its place (analytics-question-v0-86-2). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "aider/analytics-question-v0-86-2",
          "page": "https://xsavikx.github.io/agent-signals/corpus/aider/analytics-question-v0-86-2.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/aider/analytics-question-v0-86-2.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/aider/analytics-question-v0-86-2.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/aider/screens/analytics-question-v0-86-2.yaml",
          "fields": {
            "agent": "aider",
            "agent_version": "0.86.2",
            "capture": "plain",
            "description": "Aider 0.86.2 asks the analytics question in place of the git question of git-repo-question-v0-86-2. Below one rule it writes \"Aider respects your privacy and never collects your code, chat messages, keys or personal info.\", a link to the analytics page, and \"Allow collection of anonymous analytics to help improve aider? (Y)es/(N)o [Yes]:\" on plain lines, and waits for a line of text. There is no input box. In this run only ubuntu-22.04-arm showed this question. Fact 49 saw it on ubuntu-26.04-arm in an earlier run, so the choice is probably random for each install. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-22.04-arm (arm64), with a throwaway HOME, no login and no key. The capture holds no path, so it has no edit.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              30,
              49
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        },
        {
          "key": "aider/git-repo-question-v0-86-2",
          "page": "https://xsavikx.github.io/agent-signals/corpus/aider/git-repo-question-v0-86-2.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/aider/git-repo-question-v0-86-2.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/aider/git-repo-question-v0-86-2.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/aider/screens/git-repo-question-v0-86-2.yaml",
          "fields": {
            "agent": "aider",
            "agent_version": "0.86.2",
            "capture": "plain",
            "description": "Aider 0.86.2 in a folder with no git repository. Below one rule, Aider asks on a plain line \"No git repo found, create one to track aider's changes (recommended)? (Y)es/(N)o [Yes]:\" and waits for a line of text. There is no input box. On one label (ubuntu-26.04-arm in run 41137353062, fact 49) Aider first asked the analytics question in place of this one. Eight more labels gave the same bytes. On ubuntu-22.04-arm, Aider asked the analytics question (analytics-question-v0-86-2). The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              30
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "amp",
      "display": "Amp",
      "coverage": [
        {
          "version": "0.0.1793390435-g08e9ec",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (login-v0-0-1793390435-g08e9ec). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "amp/login-v0-0-1793390435-g08e9ec",
          "page": "https://xsavikx.github.io/agent-signals/corpus/amp/login-v0-0-1793390435-g08e9ec.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/amp/login-v0-0-1793390435-g08e9ec.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/amp/login-v0-0-1793390435-g08e9ec.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/amp/screens/login-v0-0-1793390435-g08e9ec.yaml",
          "fields": {
            "agent": "amp",
            "agent_version": "0.0.1793390435-g08e9ec",
            "capture": "plain",
            "description": "Amp 0.0.1793390435-g08e9ec with no key. Amp writes two plain lines, \"No API key found. Starting login flow...\" and \"Would you like to log in to Amp? [(y)es, (n)o]:\", and waits for an answer. There is no input box. The other nine Linux and macOS labels of the run gave the same bytes. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              46
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "auggie",
      "display": "Auggie",
      "coverage": [
        {
          "version": "0.36.0",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (login-v0-36-0). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "auggie/login-v0-36-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/auggie/login-v0-36-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/auggie/login-v0-36-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/auggie/login-v0-36-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/auggie/screens/login-v0-36-0.yaml",
          "fields": {
            "agent": "auggie",
            "agent_version": "0.36.0",
            "capture": "plain",
            "description": "Auggie 0.36.0 with no login. The logo is above \"New to Augment? You can create an account from the login page.\", \"→ Login to continue\" and \"Press return to open your browser\". There is no input box. The other nine Linux and macOS labels of the run gave the same bytes. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              46
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "claude",
      "display": "Claude Code",
      "coverage": [
        {
          "version": "2.1.309",
          "date": "2026-10-24",
          "method": "fresh capture of 14 screens in a private tmux server, 120x40",
          "notes": "Covers idle, typed, busy, Bash and Write permission dialogs, the AskUserQuestion wizard (two tabs and the review), and a background shell. Not checked: the folder-trust dialog, Rewind, plan mode, long pasted text."
        }
      ],
      "screens": [
        {
          "key": "claude/after-ask-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/after-ask-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/after-ask-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/after-ask-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/after-ask-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "The turn ended after the answers were submitted. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/after-deny-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/after-deny-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/after-deny-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/after-deny-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/after-deny-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "The turn ended after the Write permission was refused with option 3. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/ask-q1-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/ask-q1-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/ask-q1-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/ask-q1-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/ask-q1-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "AskUserQuestion with two questions: the first tab. The tab line is \"☐ Colour  ☐ Size  ✔ Submit\". Each option has a description line. A rule separates option 4. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "question",
              "options": [
                {
                  "label": "Red",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Blue",
                  "n": 2
                },
                {
                  "label": "Type something.",
                  "n": 3
                },
                {
                  "label": "Chat about this",
                  "n": 4
                }
              ],
              "question": "Which colour do you like?",
              "state": "PERMISSION"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/ask-q2-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/ask-q2-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/ask-q2-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/ask-q2-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/ask-q2-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "AskUserQuestion: the second tab, after a digit answered the first. No hook fires for this tab. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "question",
              "options": [
                {
                  "label": "Small",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Large",
                  "n": 2
                },
                {
                  "label": "Type something.",
                  "n": 3
                },
                {
                  "label": "Chat about this",
                  "n": 4
                }
              ],
              "question": "Which size do you need?",
              "state": "PERMISSION"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/ask-review-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/ask-review-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/ask-review-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/ask-review-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/ask-review-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "The review screen of the AskUserQuestion wizard. It has no footer. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "review",
              "options": [
                {
                  "label": "Submit answers",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Cancel",
                  "n": 2
                }
              ],
              "question": "Ready to submit your answers?",
              "state": "PERMISSION"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/ask",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/ask.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/ask.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/ask.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/ask.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.263",
            "capture": "plain",
            "description": "The first question of an AskUserQuestion wizard of two questions. The footer holds \"Esc to cancel\", and a digit activates an option at once. The second question fires no Notification hook. The size of the pane was not recorded. `tests/test_sessions.py::test_a_question_wizard_is_a_dialog_with_its_options_and_question` asserts the state, the question and the options.\n",
            "edits": [
              "rule lines may be shortened; not verified against a new capture"
            ],
            "expect": {
              "dialog": "question",
              "options": [
                {
                  "label": "Alpha",
                  "n": 1
                },
                {
                  "label": "Beta",
                  "n": 2
                },
                {
                  "label": "Type something.",
                  "n": 3
                },
                {
                  "label": "Chat about this",
                  "n": 4
                }
              ],
              "question": "Pick a letter",
              "state": "PERMISSION"
            },
            "facts": [
              3,
              4
            ],
            "measured": "2026-09-08T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/background-shell-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/background-shell-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/background-shell-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/background-shell-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/background-shell-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "The main turn ended while a background shell runs: \"1 shell still running\" and \"1 shell · ↓ to manage\" in the footer. The session file says status \"shell\". The box is framed and empty. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/busy-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/busy-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/busy-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/busy-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/busy-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "About 1.5 s after the prompt was sent: \"Thinking\", and \"esc to interrupt\" in the footer. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "BUSY"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/busy",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/busy.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/busy.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/busy.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/busy.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.226",
            "capture": "plain",
            "derived_from": "hand-built",
            "description": "A framed input box with the footer \"esc to interrupt\" of a turn that runs. It is a minimal shape with rules of 8 characters. The version and the date come from the tg-bridge module docstring. `tests/test_sessions.py::test_a_working_session_is_recognised` asserts the state.\n",
            "expect": {
              "dialog": "none",
              "state": "BUSY"
            },
            "facts": [
              1
            ],
            "measured": "2026-08-10T00:00:00Z",
            "provenance": "derived",
            "schema": 1
          }
        },
        {
          "key": "claude/dialog-over-box",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/dialog-over-box.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/dialog-over-box.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/dialog-over-box.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/dialog-over-box.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.283",
            "capture": "plain",
            "description": "The auto mode environment dialog. It draws between two rules ABOVE a live input box, and the box keeps its frame and the unsent text. The last line-starting mark is the box, so every marker of the dialog is outside the input region. A reader that tests the frame alone gives IDLE, and an Enter then confirms the selected option. tg-bridge measured it in a live pane. The size of the pane was not recorded. `tests/test_sessions.py::test_a_dialog_above_a_framed_box_is_not_idle` asserts the state. `tests/test_sessions.py::test_the_options_of_an_overlay_are_read_from_the_block` asserts the options, read from the block of the dialog and not from the input region. `tests/test_sessions.py::test_the_overlay_summary_gives_the_question_and_every_option` asserts that the summary holds the question.\n",
            "edits": [
              "rule lines may be shortened; not verified against a new capture (each rule here has 80 characters)",
              "the reply line above the dialog is replaced with neutral text of a similar length (the original is the text of a real conversation)",
              "the unsent text in the input box is replaced with neutral text of the same length (the original is the text of a real conversation)"
            ],
            "expect": {
              "options": [
                {
                  "label": "Yes",
                  "n": 1
                },
                {
                  "label": "Not now",
                  "n": 2
                },
                {
                  "label": "Don't show again",
                  "n": 3
                }
              ],
              "question": "Teach auto mode about your environment?",
              "state": "DIALOG_OVER_BOX"
            },
            "facts": [
              2
            ],
            "measured": "2026-09-28T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/idle-after-turn-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/idle-after-turn-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/idle-after-turn-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/idle-after-turn-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/idle-after-turn-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "The turn ended after an approved Bash command. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/idle-default-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/idle-default-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/idle-default-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/idle-default-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/idle-default-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "A new session in manual (default) permission mode, with a faint placeholder in the box. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/idle-placeholder-auto-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/idle-placeholder-auto-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/idle-placeholder-auto-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/idle-placeholder-auto-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/idle-placeholder-auto-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "A new session in auto mode. The input box shows a faint placeholder (\"Try ...\") that nobody typed. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/idle-shell-done-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/idle-shell-done-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/idle-shell-done-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/idle-shell-done-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/idle-shell-done-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "The same session after the background shell ended. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/idle",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/idle.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/idle.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/idle.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/idle.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.226",
            "capture": "plain",
            "derived_from": "hand-built",
            "description": "An empty input box between two rules, with the idle footer. It is a minimal shape: each rule has 8 characters, so it is not the bytes of a capture. The version and the date come from the tg-bridge module docstring. `tests/test_sessions.py::test_an_idle_box_is_recognised` and `tests/test_claude_screen.py::test_classify_reads_a_screen_with_no_tmux` assert the state.\n",
            "expect": {
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              1
            ],
            "measured": "2026-08-10T00:00:00Z",
            "provenance": "derived",
            "schema": 1
          }
        },
        {
          "key": "claude/overlay-footer-without-options",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/overlay-footer-without-options.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/overlay-footer-without-options.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/overlay-footer-without-options.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/overlay-footer-without-options.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.283",
            "capture": "plain",
            "derived_from": "hand-built",
            "description": "Negative control 3 of the dialog above a box: a reply that quotes the footer text as prose, with no numbered option under a cursor mark. Without it, no screen can break the option-list condition. The version and the date are those of the dialog above a box. `tests/test_sessions.py::test_a_footer_with_no_option_list_above_the_box_is_still_idle` asserts the state.\n",
            "edits": [
              "the reply line above the dialog is replaced with neutral text of a similar length (the original is the text of a real conversation)",
              "the unsent text in the input box is replaced with neutral text of the same length (the original is the text of a real conversation)"
            ],
            "expect": {
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              2
            ],
            "measured": "2026-09-28T00:00:00Z",
            "negative_control_for": "dialog-over-box",
            "provenance": "derived",
            "schema": 1
          }
        },
        {
          "key": "claude/overlay-plain-list",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/overlay-plain-list.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/overlay-plain-list.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/overlay-plain-list.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/overlay-plain-list.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.283",
            "capture": "plain",
            "derived_from": "hand-built",
            "description": "Negative control 2 of the dialog above a box: a reply with a numbered list above a framed box, with no cursor mark on an option and no footer. This is ordinary output, and the pane is idle. The version and the date are those of the dialog above a box. `tests/test_sessions.py::test_a_numbered_list_in_a_reply_above_the_box_is_still_idle` asserts the state on the original text.\n",
            "edits": [
              "the three list items and the text in the input box are replaced with neutral text of a similar length (the originals can be the text of a real conversation)"
            ],
            "expect": {
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              2
            ],
            "measured": "2026-09-28T00:00:00Z",
            "negative_control_for": "dialog-over-box",
            "provenance": "derived",
            "schema": 1
          }
        },
        {
          "key": "claude/overlay-without-footer",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/overlay-without-footer.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/overlay-without-footer.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/overlay-without-footer.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/overlay-without-footer.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.283",
            "capture": "plain",
            "derived_from": "dialog-over-box: the footer line \"Enter to confirm · Esc to cancel\" is removed",
            "description": "Negative control 1 of the dialog above a box: the same shape with no footer. One of the two conditions is absent, so the screen must not read as the dialog. `tests/test_sessions.py::test_the_dialog_needs_the_footer_as_well_as_the_option_list` asserts the state.\n",
            "expect": {
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              2
            ],
            "measured": "2026-09-28T00:00:00Z",
            "negative_control_for": "dialog-over-box",
            "provenance": "derived",
            "schema": 1
          }
        },
        {
          "key": "claude/paste-and-text",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/paste-and-text.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/paste-and-text.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/paste-and-text.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/paste-and-text.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "derived_from": "paste: typed text follows the marker in the box",
            "description": "Negative control of the paste marker: a box that holds a marker and typed text. A tool that sends text must not read this marker as its own text. `tests/test_sessions.py::test_the_measured_paste_screens_hold_a_marker_and_nothing_else` asserts that the box holds no lone marker. No tg-bridge test asserts the state of this screen. The expected state is the value that the classifier of tg-bridge gives at commit 1997190. It is not a test assertion.\n",
            "expect": {
              "state": "IDLE"
            },
            "facts": [
              13
            ],
            "measured": "2026-10-24T00:00:00Z",
            "negative_control_for": "paste",
            "provenance": "derived",
            "schema": 1
          }
        },
        {
          "key": "claude/paste-lines",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/paste-lines.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/paste-lines.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/paste-lines.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/paste-lines.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "derived_from": "paste: the marker is \"[Pasted text #5 +2 lines]\", for 902 characters on 3 lines",
            "description": "A paste of text with line breaks. The marker counts the line breaks. `tests/test_sessions.py::test_the_measured_paste_screens_hold_a_marker_and_nothing_else` asserts the marker. No tg-bridge test asserts the state of this screen. The expected state is the value that the classifier of tg-bridge gives at commit 1997190. It is not a test assertion.\n",
            "expect": {
              "state": "IDLE"
            },
            "facts": [
              13
            ],
            "measured": "2026-10-24T00:00:00Z",
            "provenance": "derived",
            "schema": 1
          }
        },
        {
          "key": "claude/paste",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/paste.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/paste.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/paste.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/paste.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "A long paste: send-keys -l typed 850 characters on one line into an empty box. Claude Code drew the marker \"[Pasted text #1]\" in place of the text, and a footer that names it. The pane was 120 columns wide. The number of rows was not recorded. `tests/test_sessions.py::test_the_measured_paste_screens_hold_a_marker_and_nothing_else` asserts the state.\n",
            "edits": [
              "the first line was indented by 60 spaces, and this copy keeps 2 (tg-bridge comment)",
              "lines above the shown text are left out; the tg-bridge comment does not say how many"
            ],
            "expect": {
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              13
            ],
            "measured": "2026-10-24T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/permission-bash-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/permission-bash-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/permission-bash-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/permission-bash-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/permission-bash-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "A Bash permission dialog. Option 2 wraps over three lines because it holds the folder path. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "permission",
              "options": [
                {
                  "label": "Yes",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Yes, and always allow access to /work/example from this project",
                  "n": 2
                },
                {
                  "label": "Yes, and switch to auto mode · auto mode handles these prompts for you",
                  "n": 3
                },
                {
                  "label": "No",
                  "n": 4
                }
              ],
              "question": "Do you want to proceed?",
              "state": "PERMISSION"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/permission-write-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/permission-write-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/permission-write-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/permission-write-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/permission-write-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "A Write permission dialog with a file preview between dashed rules. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "permission",
              "options": [
                {
                  "label": "Yes",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Yes, and switch to accept edits (auto-approve file edits and common file commands) for this session (shift+tab)",
                  "n": 2
                },
                {
                  "label": "No",
                  "n": 3
                }
              ],
              "question": "Do you want to create notes.txt?",
              "state": "PERMISSION"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/permission",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/permission.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/permission.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/permission.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/permission.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.226",
            "capture": "plain",
            "description": "A permission dialog for a Write call. Its options are numbered, its mark is unframed, and its footer holds \"Esc to cancel\". The tg-bridge module docstring says that a live probe measured it against Claude Code 2.1.226 on 2026-08-10. The size of the pane was not recorded. `tests/test_sessions.py::test_a_permission_dialog_is_recognised` asserts the state, `tests/test_sessions.py::test_the_dialog_question_is_read_from_above_the_input_region` the question, and `tests/test_sessions.py::test_the_dialog_options_are_read_from_the_input_region` the options.\n",
            "edits": [
              "rule lines may be shortened; not verified against a new capture"
            ],
            "expect": {
              "dialog": "permission",
              "options": [
                {
                  "label": "Yes",
                  "n": 1
                },
                {
                  "label": "Yes, allow all edits during this session (shift+tab)",
                  "n": 2
                },
                {
                  "label": "No",
                  "n": 3
                }
              ],
              "question": "Do you want to create cedar.txt?",
              "state": "PERMISSION"
            },
            "facts": [
              1,
              4
            ],
            "measured": "2026-08-10T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/quoted-dialog",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/quoted-dialog.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/quoted-dialog.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/quoted-dialog.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/quoted-dialog.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.283",
            "capture": "plain",
            "derived_from": "hand-built",
            "description": "A reply that quotes a captured dialog, with a rule above the quote, above a framed box. The expected state is wrong on purpose. Do not \"fix\" it. The version and the date are those of the dialog above a box. `tests/test_sessions.py::test_a_reply_that_quotes_a_dialog_reads_as_that_dialog` asserts the state.\n",
            "expect": {
              "state": "DIALOG_OVER_BOX"
            },
            "facts": [
              2
            ],
            "known_false_positive": true,
            "known_false_positive_reason": "A reply that quotes a dialog holds every part of the rule for a dialog above a box, and no text on the screen tells the quote apart from a real dialog. A reader that gives DIALOG_OVER_BOX sends no key, which is fail-safe. A tighter rule reads a real dialog as an idle box and sends an Enter into it.\n",
            "measured": "2026-09-28T00:00:00Z",
            "provenance": "derived",
            "schema": 1
          }
        },
        {
          "key": "claude/review",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/review.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/review.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/review.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/review.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.263",
            "capture": "plain",
            "description": "The review screen at the end of the same wizard. It has no footer, so the \"Esc to cancel\" marker is absent. A numbered list under an unframed cursor makes it a dialog. A digit 1 submits the answers. The size of the pane was not recorded. `tests/test_sessions.py::test_the_review_screen_of_a_wizard_is_a_dialog_although_it_has_no_footer` asserts the state, the question and the options.\n",
            "edits": [
              "rule lines may be shortened; not verified against a new capture"
            ],
            "expect": {
              "dialog": "review",
              "options": [
                {
                  "label": "Submit answers",
                  "n": 1
                },
                {
                  "label": "Cancel",
                  "n": 2
                }
              ],
              "question": "Ready to submit your answers?",
              "state": "PERMISSION"
            },
            "facts": [
              3,
              4
            ],
            "measured": "2026-09-08T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/rewind",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/rewind.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/rewind.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/rewind.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/rewind.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.226",
            "capture": "plain",
            "description": "The Rewind dialog. Its list cursor is the same mark as the input box, and it starts its line, but no frame of rules surrounds it. Before 2026-08-18 tg-bridge read it as IDLE and typed into the live dialog. tg-bridge captured it from a live pane on 2026-08-18, and the comment records no version. 2.1.226 is the last version that tg-bridge documents before that date, and 2.1.238 is documented on 2026-08-20, so the real version is in that range. The prompts \"ping\" and \"where are we?\" are kept with the approval of the operator. The size of the pane was not recorded. `tests/test_sessions.py::test_an_unrecognised_dialog_is_not_idle` asserts the state.\n",
            "edits": [
              "rule lines may be shortened; not verified against a new capture"
            ],
            "expect": {
              "state": "UNKNOWN"
            },
            "facts": [
              1
            ],
            "measured": "2026-08-18T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/styled-placeholder",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/styled-placeholder.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/styled-placeholder.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/styled-placeholder.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/styled-placeholder.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "styled",
            "derived_from": "styled-suggestion: the faint text is the placeholder of the empty box of a new process",
            "description": "The faint placeholder of the empty box of a new process. Each line keeps the SGR escape codes of capture-pane -e. A reader must remove the escape codes and each faint (SGR 2) character before it reads the box. On the raw bytes, the classifier of tg-bridge gives NO_BOX, because an escape code comes before the mark. `tests/test_sessions.py::test_a_faint_suggestion_reads_as_an_empty_box` asserts an empty box after the faint text is removed. No tg-bridge test asserts the state of this screen. The expected state is the value that the classifier of tg-bridge gives at commit 1997190. It is not a test assertion.\n",
            "expect": {
              "box_text": null,
              "state": "IDLE"
            },
            "facts": [
              5
            ],
            "measured": "2026-10-24T00:00:00Z",
            "provenance": "derived",
            "schema": 1
          }
        },
        {
          "key": "claude/styled-suggestion",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/styled-suggestion.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/styled-suggestion.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/styled-suggestion.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/styled-suggestion.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "styled",
            "description": "A suggestion after the fourth turn of a session. The suggestion is faint (SGR 2), and a C-u did not remove it. Each line keeps the SGR escape codes of capture-pane -e. A reader must remove the escape codes and each faint (SGR 2) character before it reads the box. On the raw bytes, the classifier of tg-bridge gives NO_BOX, because an escape code comes before the mark. The pane was 120 columns wide. The number of rows was not recorded. `tests/test_sessions.py::test_a_faint_suggestion_reads_as_an_empty_box` asserts IDLE and an empty box after the faint text is removed.\n",
            "edits": [
              "only the last five lines of the capture are kept (tg-bridge comment)",
              "the first line is cut, and only its end is kept (tg-bridge comment)"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              5
            ],
            "measured": "2026-10-24T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/styled-typed-same",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/styled-typed-same.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/styled-typed-same.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/styled-typed-same.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/styled-typed-same.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "styled",
            "derived_from": "styled-suggestion: the SGR 2 codes around \"run git status\" are removed, as when the text is typed",
            "description": "Negative control of the faint suggestion: the same text, typed into the box with send-keys -l, has no SGR 2, so it is text. Each line keeps the SGR escape codes of capture-pane -e. A reader must remove the escape codes and each faint (SGR 2) character before it reads the box. On the raw bytes, the classifier of tg-bridge gives NO_BOX, because an escape code comes before the mark. `tests/test_sessions.py::test_a_faint_suggestion_reads_as_an_empty_box` asserts IDLE and the box text after the faint text is removed.\n",
            "expect": {
              "box_text": "run git status",
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              5
            ],
            "measured": "2026-10-24T00:00:00Z",
            "negative_control_for": "styled-suggestion",
            "provenance": "derived",
            "schema": 1
          }
        },
        {
          "key": "claude/suggestion",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/suggestion.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/suggestion.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/suggestion.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/suggestion.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.226",
            "capture": "plain",
            "derived_from": "hand-built",
            "description": "A framed input box that shows a suggestion that nobody typed. In a plain capture the suggestion looks like typed text. It is a minimal shape with rules of 8 characters. The version and the date come from the tg-bridge module docstring. `tests/test_sessions.py::test_a_suggestion_in_the_box_is_still_idle` asserts the state.\n",
            "expect": {
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              5
            ],
            "measured": "2026-08-10T00:00:00Z",
            "provenance": "derived",
            "schema": 1
          }
        },
        {
          "key": "claude/trust-accept-selected",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/trust-accept-selected.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/trust-accept-selected.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/trust-accept-selected.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/trust-accept-selected.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.251",
            "capture": "plain",
            "derived_from": "trust: one Down moves the mark from \"No, exit\" to \"Yes, I trust this folder\"",
            "description": "The folder-trust question after one Down. This is the only state in which an Enter accepts the folder. `tests/test_sessions.py::test_both_selections_of_the_trust_dialog_are_classified_as_trust` asserts the state. `tests/test_sessions.py::test_send_keys_moves_the_mark_onto_the_accept_option_before_it_answers` pins the mark on the accept option.\n",
            "expect": {
              "dialog": "trust",
              "options": [
                {
                  "label": "No, exit"
                },
                {
                  "label": "Yes, I trust this folder",
                  "selected": true
                }
              ],
              "state": "TRUST"
            },
            "facts": [
              10
            ],
            "measured": "2026-09-01T00:00:00Z",
            "provenance": "derived",
            "schema": 1
          }
        },
        {
          "key": "claude/trust",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/trust.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/trust.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/trust.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/trust.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.251",
            "capture": "plain",
            "description": "The folder-trust question as Claude Code 2.1.251 draws it. The options have no numbers, and the mark starts on \"No, exit\", so a bare Enter ends the session. The tg-bridge comment says that only the path is edited. The size of the pane was not recorded. `tests/test_sessions.py::test_both_selections_of_the_trust_dialog_are_classified_as_trust` asserts the state. `tests/test_sessions.py::test_send_keys_never_sends_enter_while_the_trust_mark_is_on_the_exit_option` pins the mark on \"No, exit\".\n",
            "edits": [
              "the workspace path is scrubbed to /work/example (tg-bridge had already replaced the real path with a placeholder path on its host)"
            ],
            "expect": {
              "dialog": "trust",
              "options": [
                {
                  "label": "No, exit",
                  "selected": true
                },
                {
                  "label": "Yes, I trust this folder"
                }
              ],
              "state": "TRUST"
            },
            "facts": [
              1,
              10
            ],
            "measured": "2026-09-01T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "claude/typed-list",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/typed-list.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/typed-list.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/typed-list.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/typed-list.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.263",
            "capture": "plain",
            "derived_from": "hand-built",
            "description": "A real input box whose typed text starts like a numbered option. The frame keeps it out of the rule that reads an unframed numbered list as a dialog. The tg-bridge comment gives no version. The version and the date are those of the wizard screens, because fact 15 of tg-bridge names this screen as their negative control. It is a minimal shape with rules of 8 characters. `tests/test_sessions.py::test_a_box_that_holds_text_like_an_option_is_still_idle` asserts the state.\n",
            "expect": {
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              1,
              3
            ],
            "measured": "2026-09-08T00:00:00Z",
            "negative_control_for": "review",
            "provenance": "derived",
            "schema": 1
          }
        },
        {
          "key": "claude/typed-v2-1-309",
          "page": "https://xsavikx.github.io/agent-signals/corpus/claude/typed-v2-1-309.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/claude/typed-v2-1-309.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/claude/typed-v2-1-309.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/claude/screens/typed-v2-1-309.yaml",
          "fields": {
            "agent": "claude",
            "agent_version": "2.1.309",
            "capture": "plain",
            "description": "Text typed into the box, not sent yet. The footer drops the shortcut hint while the box holds text. Captured by the ai-world project with Claude Code 2.1.309 (model Haiku 5.5) in a private tmux server.",
            "edits": [
              "the workspace path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": "Use the Bash tool to run exactly this command: echo hello > hello.txt",
              "dialog": "none",
              "state": "IDLE"
            },
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "cline",
      "display": "Cline CLI",
      "coverage": [
        {
          "version": "3.0.74",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (provider-v3-0-74). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "cline/provider-v3-0-74",
          "page": "https://xsavikx.github.io/agent-signals/corpus/cline/provider-v3-0-74.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/cline/provider-v3-0-74.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/cline/provider-v3-0-74.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/cline/screens/provider-v3-0-74.yaml",
          "fields": {
            "agent": "cline",
            "agent_version": "3.0.74",
            "capture": "plain",
            "description": "Cline CLI 3.0.74 with no login. The logo, \"Welcome to Cline\" and \"Connect a model provider to get started.\" are above four framed boxes: \"Sign in with Cline\" (with the arrow \"→\"), \"Sign in with ClinePass\", \"Sign in with ChatGPT\" and \"Bring your own provider\", and the footer \"↑/↓ navigate, Enter to select, Ctrl+C to exit\". The framed boxes are choices, not an input box. The other nine Linux and macOS labels of the run gave the same bytes. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              46
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "codebuddy",
      "display": "CodeBuddy Code",
      "coverage": [
        {
          "version": "2.179.0",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (trust-v2-179-0). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "codebuddy/trust-v2-179-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codebuddy/trust-v2-179-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codebuddy/trust-v2-179-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codebuddy/trust-v2-179-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codebuddy/screens/trust-v2-179-0.yaml",
          "fields": {
            "agent": "codebuddy",
            "agent_version": "2.179.0",
            "capture": "plain",
            "description": "CodeBuddy Code 2.179.0 asks the folder-trust question before a login. A framed dialog holds \"Do you trust the files in this folder?\", the work folder, a warning, a link, four numbered options with \"> 1. Trust folder only (example)\" under the mark, and the footer \"Enter to confirm • Esc to exit\". The other five Linux labels gave the same screen, except the random part of the folder. On the four macOS labels the folder line has one space less before the right frame, because the home folder of the runner is one character longer there. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [
              "tools/scrub.sh changed the home folder of the runner account to ~, so the line that held the path is shorter",
              "the throwaway folder ~/.cache/agent-signals/run.<random>/work/example is replaced with /work/example, so that line is shorter again"
            ],
            "expect": {
              "dialog": "trust",
              "options": [
                {
                  "label": "Trust folder only (example)",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Trust parent folder (work/**)",
                  "n": 2
                },
                {
                  "label": "Trust folder and all subdirectories (example/**)",
                  "n": 3
                },
                {
                  "label": "No, exit (escape)",
                  "n": 4
                }
              ],
              "question": "Do you trust the files in this folder?",
              "state": "TRUST"
            },
            "facts": [
              61
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "codebuff",
      "display": "Codebuff",
      "coverage": [
        {
          "version": "1.0.688",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (login-v1-0-688). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "codebuff/login-v1-0-688",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codebuff/login-v1-0-688.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codebuff/login-v1-0-688.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codebuff/login-v1-0-688.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codebuff/screens/login-v1-0-688.yaml",
          "fields": {
            "agent": "codebuff",
            "agent_version": "1.0.688",
            "capture": "plain",
            "description": "Codebuff 1.0.688 with no login draws the word CODEBUFF in large block letters and \"Press ENTER to login...\" below it. There is no input box. The other nine Linux and macOS labels gave the same bytes. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              61
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "codex",
      "display": "Codex CLI",
      "coverage": [
        {
          "version": "0.163.0",
          "date": "2026-10-24",
          "method": "capture-pane -p of codex --no-daemon in a private tmux server, 120x40, from the Codex measurement report of the tg-bridge project (9 screens, empty lines removed by the report), and one aw doctor capture of the approval dialog",
          "notes": "Covers idle, typed, busy, a busy turn with a background command, the end of a turn, the command approval dialog, the end of a cancelled approval, the folder-trust dialog and the hooks review dialog. Not checked: the file-change approval dialog, styled captures, the slash command menu, a pane narrower than 120 columns, a TUI that uses the shared app-server daemon, and the keys of the approval dialog other than Esc."
        },
        {
          "version": "0.164.0",
          "date": "2026-10-30",
          "method": "capture-pane -p of codex in the default daemon mode (no --no-daemon), 120x40, in a private tmux server with a throwaway HOME, by the scenario scenarios/codex/screens.sh",
          "notes": "Covers idle, busy, the F2 Warnings view and the screen after Esc on it. The busy footer still shows \"? for shortcuts\". Not checked: styled captures, and a pane narrower than 120 columns."
        },
        {
          "version": "0.164.0",
          "date": "2026-10-30",
          "method": "capture-pane -p of codex in the default daemon mode, 120x40, in a private tmux server with a throwaway HOME, by the scenarios scenarios/codex/deny.sh and scenarios/codex/interrupt.sh",
          "notes": "Covers the command approval dialog, the screen after the digit 3 (\"No, and tell Codex what to do differently\") on it, and the dialog \"Task is still running\" that Ctrl+C opens during a turn. Not checked: the file-change approval dialog, the hooks review dialog of this version (fact 38 gives its text), styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "codex/after-cancel-v0-163-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/after-cancel-v0-163-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/after-cancel-v0-163-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/after-cancel-v0-163-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/after-cancel-v0-163-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.163.0",
            "capture": "plain",
            "description": "Esc on the approval dialog. Codex cancelled the command and ended the turn (\"■ Conversation interrupted\"). The empty box and the footer \"? for shortcuts\" are back. Measured by the tg-bridge project with Codex CLI 0.163.0 (codex --no-daemon) in a private tmux server, and published in its report \"Codex CLI and Cursor CLI as harnesses: measurements, 2026-10-24\".",
            "edits": [
              "the source report removed the empty lines of the capture",
              "the project path is scrubbed to /work/example",
              "the source report shows the update banner and the header only on its idle screen; this excerpt has the lines that the report shows"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              20
            ],
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/after-deny-v0-164-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/after-deny-v0-164-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/after-deny-v0-164-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/after-deny-v0-164-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/after-deny-v0-164-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.164.0",
            "capture": "plain",
            "description": "3 s after the digit 3 (\"3. No, and tell Codex what to do differently\") on the approval dialog, with no Enter. The history above it shows an approved write and an Esc on a second dialog. The denial draws the same lines as the Esc: \"✗ You canceled the request to run ...\", \"• Exited (status 1) ...\", and \"■ Conversation interrupted - use /feedback if something went wrong\". The empty box and the footer \"? for shortcuts\" are back, and Codex asks for no text. Measured with the scenario scenarios/codex/deny.sh.",
            "edits": [
              "the path of the throwaway folder is scrubbed to /work/example, so each line that held it is shorter"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              20,
              36
            ],
            "measured": "2026-10-30T00:00:00Z",
            "negative_control_for": "approval-v0-164-0",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/after-turn-v0-163-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/after-turn-v0-163-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/after-turn-v0-163-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/after-turn-v0-163-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/after-turn-v0-163-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.163.0",
            "capture": "plain",
            "description": "The turn ended. The answer and \"Worked for 1s\" are above the box. The busy line is gone, and the last line starts with \"? for shortcuts\". Measured by the tg-bridge project with Codex CLI 0.163.0 (codex --no-daemon) in a private tmux server, and published in its report \"Codex CLI and Cursor CLI as harnesses: measurements, 2026-10-24\".",
            "edits": [
              "the source report removed the empty lines of the capture",
              "the project path is scrubbed to /work/example",
              "the source report shows the update banner and the header only on its idle screen; this excerpt has the lines that the report shows"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              20
            ],
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/after-warnings-v0-164-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/after-warnings-v0-164-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/after-warnings-v0-164-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/after-warnings-v0-164-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/after-warnings-v0-164-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.164.0",
            "capture": "plain",
            "description": "The screen after Esc on the Warnings view: the box is back, and the footer no longer shows the warning count, because Esc dismissed the warning. The status line holds the title of the session after the folder. Measured with the scenario scenarios/codex/screens.sh.",
            "edits": [
              "the path of the throwaway folder is scrubbed to /work/example, so each line that held it is shorter"
            ],
            "expect": {
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              20
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/approval-full-v0-163-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/approval-full-v0-163-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/approval-full-v0-163-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/approval-full-v0-163-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/approval-full-v0-163-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.163.0",
            "capture": "plain",
            "description": "The approval dialog on a full screen, with the empty lines kept. The history above the dialog holds a message that starts with \"›\" and the line \"• Running date >> codex.txt\". Captured by the ai-world project with aw doctor (--raw-screens) from a Codex CLI 0.163.0 pane in a private tmux server. The pane size was not recorded.",
            "edits": [
              "the project path is scrubbed to /work/example",
              "the two GitHub links of the update banner, which the capture tool had replaced with pseudonyms, are restored to the text that Codex 0.163.0 draws"
            ],
            "expect": {
              "box_text": null,
              "dialog": "permission",
              "options": [
                {
                  "label": "Yes, proceed (y)",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Yes, and don't ask again for commands that start with `date >> codex.txt` (p)",
                  "n": 2
                },
                {
                  "label": "No, and tell Codex what to do differently (esc)",
                  "n": 3
                }
              ],
              "question": "Would you like to run the following command?",
              "state": "PERMISSION"
            },
            "facts": [
              19,
              20
            ],
            "measured": "2026-10-24T00:00:00Z",
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/approval-v0-163-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/approval-v0-163-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/approval-v0-163-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/approval-v0-163-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/approval-v0-163-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.163.0",
            "capture": "plain",
            "description": "The approval dialog (codex -s read-only -a on-request). It draws in place of the input box. The mark is on the selected numbered option, and the footer is \"Press enter to confirm or esc to cancel\". Measured by the tg-bridge project with Codex CLI 0.163.0 (codex --no-daemon) in a private tmux server, and published in its report \"Codex CLI and Cursor CLI as harnesses: measurements, 2026-10-24\".",
            "edits": [
              "the source report removed the empty lines of the capture",
              "the project path is scrubbed to /work/example",
              "the source report shows the update banner and the header only on its idle screen; this excerpt has the lines that the report shows"
            ],
            "expect": {
              "box_text": null,
              "dialog": "permission",
              "options": [
                {
                  "label": "Yes, proceed (y)",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Yes, and don't ask again for commands that start with `echo FIG > fig.txt` (p)",
                  "n": 2
                },
                {
                  "label": "No, and tell Codex what to do differently (esc)",
                  "n": 3
                }
              ],
              "question": "Would you like to run the following command?",
              "state": "PERMISSION"
            },
            "facts": [
              19,
              20
            ],
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/approval-v0-164-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/approval-v0-164-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/approval-v0-164-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/approval-v0-164-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/approval-v0-164-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.164.0",
            "capture": "plain",
            "description": "The command approval dialog in the default daemon mode (codex --sandbox read-only --ask-for-approval on-request), after a normal turn. It draws in place of the input box: \"Would you like to run the following command?\", \"Environment: local\", \"Reason: ...\", \"$ <command>\", the three numbered options under the mark, and the footer \"Press enter to confirm or esc to cancel\". The capture holds no path, so it has no edit. Measured with the scenario scenarios/codex/deny.sh in a private tmux server with a throwaway HOME.",
            "edits": [],
            "expect": {
              "box_text": null,
              "dialog": "permission",
              "options": [
                {
                  "label": "Yes, proceed (y)",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Yes, and don't ask again for commands that start with `printf 'hello' > note.txt` (p)",
                  "n": 2
                },
                {
                  "label": "No, and tell Codex what to do differently (esc)",
                  "n": 3
                }
              ],
              "question": "Would you like to run the following command?",
              "state": "PERMISSION"
            },
            "facts": [
              20,
              36
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        },
        {
          "key": "codex/busy-background-v0-163-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/busy-background-v0-163-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/busy-background-v0-163-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/busy-background-v0-163-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/busy-background-v0-163-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.163.0",
            "capture": "plain",
            "description": "A turn runs a shell command. The busy line adds \"1 background terminal running · /ps to view · /stop to close\" after \"esc to interrupt\". Measured by the tg-bridge project with Codex CLI 0.163.0 (codex --no-daemon) in a private tmux server, and published in its report \"Codex CLI and Cursor CLI as harnesses: measurements, 2026-10-24\".",
            "edits": [
              "the source report removed the empty lines of the capture",
              "the project path is scrubbed to /work/example",
              "the source report shows the update banner and the header only on its idle screen; this excerpt has the lines that the report shows",
              "the source report shows the screen down to the input box only"
            ],
            "expect": {
              "dialog": "none",
              "state": "BUSY"
            },
            "facts": [
              20
            ],
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/busy-v0-163-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/busy-v0-163-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/busy-v0-163-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/busy-v0-163-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/busy-v0-163-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.163.0",
            "capture": "plain",
            "description": "A turn runs, 1.4 s after the Enter. The busy line \"• Working (1s • esc to interrupt)\" is directly above the box. The box, its placeholder and the footer \"? for shortcuts\" stay drawn, so the busy test must come before the idle test. Measured by the tg-bridge project with Codex CLI 0.163.0 (codex --no-daemon) in a private tmux server, and published in its report \"Codex CLI and Cursor CLI as harnesses: measurements, 2026-10-24\".",
            "edits": [
              "the source report removed the empty lines of the capture",
              "the project path is scrubbed to /work/example",
              "the source report shows the update banner and the header only on its idle screen; this excerpt has the lines that the report shows"
            ],
            "expect": {
              "dialog": "none",
              "state": "BUSY"
            },
            "facts": [
              20
            ],
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/busy-v0-164-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/busy-v0-164-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/busy-v0-164-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/busy-v0-164-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/busy-v0-164-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.164.0",
            "capture": "plain",
            "description": "A turn runs, about 2 s after the Enter. The busy line \"◦ Working (1s • esc to interrupt)\" is above the box. The box, its placeholder and the footer \"? for shortcuts\" stay drawn while the turn runs, so the footer is not a proof of IDLE: a reader must first look for \"esc to interrupt\". tg-bridge asked for this screen (tg-bridge #120). Measured with the scenario scenarios/codex/screens.sh.",
            "edits": [
              "the path of the throwaway folder is scrubbed to /work/example, so each line that held it is shorter"
            ],
            "expect": {
              "dialog": "none",
              "state": "BUSY"
            },
            "facts": [
              20
            ],
            "measured": "2026-10-30T00:00:00Z",
            "negative_control_for": "idle-v0-164-0",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/hooks-review-v0-163-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/hooks-review-v0-163-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/hooks-review-v0-163-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/hooks-review-v0-163-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/hooks-review-v0-163-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.163.0",
            "capture": "plain",
            "description": "The hooks review dialog of a project with .codex/hooks.json that nobody trusted. The answer is the decision of the operator, so a tool sends no key to it. Measured by the tg-bridge project with Codex CLI 0.163.0 (codex --no-daemon) in a private tmux server, and published in its report \"Codex CLI and Cursor CLI as harnesses: measurements, 2026-10-24\".",
            "edits": [
              "the source report removed the empty lines of the capture",
              "the project path is scrubbed to /work/example",
              "the source report shows the update banner and the header only on its idle screen; this excerpt has the lines that the report shows"
            ],
            "expect": {
              "state": "UNKNOWN"
            },
            "facts": [
              20
            ],
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/idle-v0-163-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/idle-v0-163-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/idle-v0-163-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/idle-v0-163-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/idle-v0-163-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.163.0",
            "capture": "plain",
            "description": "A new session. The input box has no frame. The empty box shows the placeholder \"› Ask Codex to do anything\", and the last line starts with \"? for shortcuts\". An update banner in a box of ╭─╮ draws at the top; it is not the input box. Measured by the tg-bridge project with Codex CLI 0.163.0 (codex --no-daemon) in a private tmux server, and published in its report \"Codex CLI and Cursor CLI as harnesses: measurements, 2026-10-24\".",
            "edits": [
              "the source report removed the empty lines of the capture",
              "the project path is scrubbed to /work/example"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              20
            ],
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/idle-v0-164-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/idle-v0-164-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/idle-v0-164-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/idle-v0-164-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/idle-v0-164-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.164.0",
            "capture": "plain",
            "description": "The idle screen of a new session in the default daemon mode: the welcome text, the box \"› Ask Codex to do anything\", the status line, and the footer \"← for agents · ? for shortcuts\" with \"⚠ 1 warning · f2 to\" at the right edge (cut at 120 columns). Measured with the scenario scenarios/codex/screens.sh (codex --sandbox read-only --ask-for-approval on-request) in a private tmux server with a throwaway HOME.",
            "edits": [
              "the path of the throwaway folder is scrubbed to /work/example, so each line that held it is shorter"
            ],
            "expect": {
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              20
            ],
            "measured": "2026-10-30T00:00:00Z",
            "negative_control_for": "busy-v0-164-0",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/task-running-v0-164-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/task-running-v0-164-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/task-running-v0-164-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/task-running-v0-164-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/task-running-v0-164-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.164.0",
            "capture": "plain",
            "description": "1 s after Ctrl+C while an approved command (sleep 20) runs. Ctrl+C does not stop the turn. It opens the dialog \"Task is still running\" in place of the input box, with \"1. Cancel task\", \"2. Run in background\" and \"3. Exit\", and the footer \"enter select · esc back\". The busy line and the footer \"? for shortcuts\" are not drawn. A digit acts at once. Measured with the scenario scenarios/codex/interrupt.sh.",
            "edits": [
              "the path of the throwaway folder is scrubbed to /work/example, so each line that held it is shorter"
            ],
            "expect": {
              "box_text": null,
              "dialog": "question",
              "options": [
                {
                  "label": "Cancel task        Stop the current task and stay in Codex",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Run in background  Exit Codex and leave the task running",
                  "n": 2
                },
                {
                  "label": "Exit               Stop the current task and exit Codex",
                  "n": 3
                }
              ],
              "question": "Task is still running",
              "state": "PERMISSION"
            },
            "facts": [
              37
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/trust-v0-163-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/trust-v0-163-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/trust-v0-163-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/trust-v0-163-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/trust-v0-163-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.163.0",
            "capture": "plain",
            "description": "The folder-trust dialog of a new git repository that Codex had not seen. The mark starts on \"Trust and continue\". The footer is \"enter continue · esc quit\". Measured by the tg-bridge project with Codex CLI 0.163.0 (codex --no-daemon) in a private tmux server, and published in its report \"Codex CLI and Cursor CLI as harnesses: measurements, 2026-10-24\".",
            "edits": [
              "the source report removed the empty lines of the capture",
              "the project path is scrubbed to /work/example",
              "the source report shows the update banner and the header only on its idle screen; this excerpt has the lines that the report shows"
            ],
            "expect": {
              "dialog": "trust",
              "options": [
                {
                  "label": "Trust and continue",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Quit",
                  "n": 2
                }
              ],
              "question": "Trust this folder?",
              "state": "TRUST"
            },
            "facts": [
              20
            ],
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/typed-v0-163-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/typed-v0-163-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/typed-v0-163-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/typed-v0-163-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/typed-v0-163-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.163.0",
            "capture": "plain",
            "description": "Text in the input box, before the Enter. The footer \"? for shortcuts\" is absent while the box holds text. With no frame and no footer, a reader cannot prove an idle box. Measured by the tg-bridge project with Codex CLI 0.163.0 (codex --no-daemon) in a private tmux server, and published in its report \"Codex CLI and Cursor CLI as harnesses: measurements, 2026-10-24\".",
            "edits": [
              "the source report removed the empty lines of the capture",
              "the project path is scrubbed to /work/example",
              "the source report shows the update banner and the header only on its idle screen; this excerpt has the lines that the report shows"
            ],
            "expect": {
              "box_text": "Reply with the word PEAR and nothing else.",
              "dialog": "none",
              "state": "UNKNOWN"
            },
            "facts": [
              20
            ],
            "known_false_positive": true,
            "known_false_positive_reason": "The box waits for a message with typed text. A Codex box has no frame, and the footer that proves an empty idle box is absent. A reader that gives IDLE here gives IDLE on a screen with no proof. UNKNOWN is the safe answer.",
            "measured": "2026-10-24T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        },
        {
          "key": "codex/warnings-v0-164-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/codex/warnings-v0-164-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/codex/warnings-v0-164-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/codex/warnings-v0-164-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/codex/screens/warnings-v0-164-0.yaml",
          "fields": {
            "agent": "codex",
            "agent_version": "0.164.0",
            "capture": "plain",
            "description": "The Warnings view after F2: \"Warnings · 1 of 1 · Startup\", the warning text, and the footer \"k keep & next · esc dismiss & close · ^o copy · ←/→ warning · ↓ scroll\". The view replaces the box, so a reader must not type into it. Esc closes it. The warning here says that bubblewrap is not on PATH. Measured with the scenario scenarios/codex/screens.sh.",
            "edits": [
              "the path of the throwaway folder is scrubbed to /work/example, so each line that held it is shorter"
            ],
            "expect": {
              "dialog": "none",
              "state": "UNKNOWN"
            },
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "continue",
      "display": "Continue CLI",
      "coverage": [
        {
          "version": "1.5.47",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (api-key-v1-5-47). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "continue/api-key-v1-5-47",
          "page": "https://xsavikx.github.io/agent-signals/corpus/continue/api-key-v1-5-47.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/continue/api-key-v1-5-47.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/continue/api-key-v1-5-47.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/continue/screens/api-key-v1-5-47.yaml",
          "fields": {
            "agent": "continue",
            "agent_version": "1.5.47",
            "capture": "plain",
            "description": "Continue CLI (cn) 1.5.47 with no key. It writes \"To get started, enter your Anthropic API key.\" and the prompt \"Enter your Anthropic API key:\" on plain lines, and waits for the key. There is no input box. The other nine Linux and macOS labels of the run gave the same bytes. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              46
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "copilot",
      "display": "Copilot CLI",
      "coverage": [
        {
          "version": "1.0.105",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (trust-v1-0-105). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "copilot/trust-v1-0-105",
          "page": "https://xsavikx.github.io/agent-signals/corpus/copilot/trust-v1-0-105.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/copilot/trust-v1-0-105.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/copilot/trust-v1-0-105.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/copilot/screens/trust-v1-0-105.yaml",
          "fields": {
            "agent": "copilot",
            "agent_version": "1.0.105",
            "capture": "plain",
            "description": "GitHub Copilot CLI 1.0.105 asks the folder-trust question before a login. The welcome text and a tip are above a framed dialog \"Confirm folder trust\" with the work folder, the question \"Do you trust the files in this folder?\", three numbered options under the mark and the footer \"↑/↓ to navigate · enter to select · esc to cancel\". The six Linux labels gave the same bytes. On the four macOS labels the folder line has one space less before the right frame, because the home folder of the runner is one character longer there. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [
              "tools/scrub.sh changed the home folder of the runner account to ~, so the line that held the path is shorter",
              "the throwaway folder ~/.cache/agent-signals/run.<random>/work/example is replaced with /work/example, so that line is shorter again"
            ],
            "expect": {
              "dialog": "trust",
              "options": [
                {
                  "label": "Yes",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Yes, and remember this folder for future sessions",
                  "n": 2
                },
                {
                  "label": "No (Esc)",
                  "n": 3
                }
              ],
              "question": "Do you trust the files in this folder?",
              "state": "TRUST"
            },
            "facts": [
              30
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "crush",
      "display": "Crush",
      "coverage": [
        {
          "version": "0.99.0",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (provider-v0-99-0). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "crush/provider-v0-99-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/crush/provider-v0-99-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/crush/provider-v0-99-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/crush/provider-v0-99-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/crush/screens/provider-v0-99-0.yaml",
          "fields": {
            "agent": "crush",
            "agent_version": "0.99.0",
            "capture": "plain",
            "description": "Crush v0.99.0 with no provider. The logo is above \"To start, let's choose a provider and model.\", a search field \"> Find your fave\", a list of models and the footer \"↑/↓ choose • enter confirm\". There is no input box for a message. The other labels gave the same screen, except the logo: the stretch of its letters changes from start to start. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              46
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "cursor",
      "display": "Cursor CLI",
      "coverage": [
        {
          "version": "2026.10.22-27dcf5f",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (login-v2026-10-22-27dcf5f). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "cursor/login-v2026-10-22-27dcf5f",
          "page": "https://xsavikx.github.io/agent-signals/corpus/cursor/login-v2026-10-22-27dcf5f.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/cursor/login-v2026-10-22-27dcf5f.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/cursor/login-v2026-10-22-27dcf5f.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/cursor/screens/login-v2026-10-22-27dcf5f.yaml",
          "fields": {
            "agent": "cursor",
            "agent_version": "2026.10.22-27dcf5f",
            "capture": "plain",
            "description": "Cursor CLI 2026.10.22-27dcf5f with no login. The pane shows only \"Cursor Agent\", the version and \"Press any key to log in...\" in the middle of an empty screen. There is no input box. The other nine Linux and macOS labels of the run gave the same bytes. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              29
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "droid",
      "display": "Factory Droid",
      "coverage": [
        {
          "version": "1.0.0",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (login-v1-0-0). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "droid/login-v1-0-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/droid/login-v1-0-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/droid/login-v1-0-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/droid/login-v1-0-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/droid/screens/login-v1-0-0.yaml",
          "fields": {
            "agent": "droid",
            "agent_version": "1.0.0",
            "capture": "plain",
            "description": "Factory Droid 1.0.0 with no login. The logo, the version, a tip and the key help are above a framed box \"Welcome to Factory CLI\", the line \"Please login with your Factory account to continue.\" and a menu with \"> Login\", \"Sign into a Factory Private deployment\" and \"Exit\". The framed box holds text, not an input box. The other labels gave the same screen, except the TIP line, which changes from start to start. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              46
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "everycode",
      "display": "Every Code",
      "coverage": [
        {
          "version": "0.6.196",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-22.04 (x64)",
          "notes": "Covers the first screen with no login (login-v0-6-196). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "everycode/login-v0-6-196",
          "page": "https://xsavikx.github.io/agent-signals/corpus/everycode/login-v0-6-196.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/everycode/login-v0-6-196.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/everycode/login-v0-6-196.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/everycode/screens/login-v0-6-196.yaml",
          "fields": {
            "agent": "everycode",
            "agent_version": "0.6.196",
            "capture": "plain",
            "description": "Every Code 0.6.196 (npm @just-every/code, command coder) with no login shows \">_ Welcome to Code\", \"What can I code for you tonight?\", and a menu with \"> 1. Sign in with ChatGPT\" and \"2. Provide your own API key\", and \"Press Enter to continue\". The words are near the first screen of Codex CLI. There is no input box. Four more labels gave the same bytes. On five labels (ubuntu-24.04, ubuntu-26.04, ubuntu-26.04-arm, macos-26 and macos-15-intel) the pane was still empty after 20 s. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-22.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              61
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "gemini",
      "display": "Gemini CLI",
      "coverage": [
        {
          "version": "0.66.0",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runners ubuntu-24.04 (x64) and ubuntu-22.04 (x64)",
          "notes": "Covers the first screen with no login (trust-v0-66-0), and the same screen with the color warning that ubuntu-22.04 gave (trust-color-warning-v0-66-0). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "gemini/trust-color-warning-v0-66-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/gemini/trust-color-warning-v0-66-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/gemini/trust-color-warning-v0-66-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/gemini/trust-color-warning-v0-66-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/gemini/screens/trust-color-warning-v0-66-0.yaml",
          "fields": {
            "agent": "gemini",
            "agent_version": "0.66.0",
            "capture": "plain",
            "description": "Gemini CLI 0.66.0 asks the folder-trust question before a login, as in trust-v0-66-0, but with four more lines above the dialog: \"⚠  Warning: Limited color support detected (TERM=screen). Some visual elements may not render correctly.\" and the tmux settings \"set -g default-terminal \"tmux-256color\"\" and \"set -ga terminal-overrides \",*256col*:Tc\"\" for ~/.tmux.conf. Gemini CLI printed this text on ubuntu-22.04 and ubuntu-22.04-arm, and not on the other eight labels of the run (fact 56). The dialog, the question and the options are the same. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-22.04 (x64), with a throwaway HOME, no login and no key. The scrub changed no line: Gemini CLI writes the short form ~/.tmux.conf itself.",
            "edits": [],
            "expect": {
              "dialog": "trust",
              "options": [
                {
                  "label": "Trust folder (example)",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Trust parent folder (work)",
                  "n": 2
                },
                {
                  "label": "Don't trust",
                  "n": 3
                }
              ],
              "question": "Do you trust the files in this folder?",
              "state": "TRUST"
            },
            "facts": [
              30,
              56
            ],
            "measured": "2026-10-30T00:00:00Z",
            "negative_control_for": "trust-v0-66-0",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        },
        {
          "key": "gemini/trust-v0-66-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/gemini/trust-v0-66-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/gemini/trust-v0-66-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/gemini/trust-v0-66-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/gemini/screens/trust-v0-66-0.yaml",
          "fields": {
            "agent": "gemini",
            "agent_version": "0.66.0",
            "capture": "plain",
            "description": "Gemini CLI 0.66.0 asks the folder-trust question before a login. The logo, the tips and the line \"Skipping project agents due to untrusted folder\" are above a framed dialog with \"Do you trust the files in this folder?\" and three numbered options. The mark of the selected option is \"●\", not \"❯\". The options name the work folder (example) and its parent (work). Seven more labels gave the same bytes. On ubuntu-22.04 and ubuntu-22.04-arm, Gemini CLI also printed a color warning (trust-color-warning-v0-66-0). The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "trust",
              "options": [
                {
                  "label": "Trust folder (example)",
                  "n": 1,
                  "selected": true
                },
                {
                  "label": "Trust parent folder (work)",
                  "n": 2
                },
                {
                  "label": "Don't trust",
                  "n": 3
                }
              ],
              "question": "Do you trust the files in this folder?",
              "state": "TRUST"
            },
            "facts": [
              30
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "goose",
      "display": "Goose",
      "coverage": [
        {
          "version": "1.57.0",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (setup-v1-57-0). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "goose/setup-v1-57-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/goose/setup-v1-57-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/goose/setup-v1-57-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/goose/setup-v1-57-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/goose/screens/setup-v1-57-0.yaml",
          "fields": {
            "agent": "goose",
            "agent_version": "1.57.0",
            "capture": "plain",
            "description": "Goose 1.57.0 with no configuration starts its setup at once: \"Welcome to goose! Let's get you set up.\", a text about anonymous usage data, and the question \"Share anonymous usage data to help improve goose?\" with \"● Yes / ○ No\". There is no input box. The other nine Linux and macOS labels of the run gave the same bytes. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              46
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "gptme",
      "display": "gptme",
      "coverage": [
        {
          "version": "0.35.1",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (conversation-v0-35-1). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "gptme/conversation-v0-35-1",
          "page": "https://xsavikx.github.io/agent-signals/corpus/gptme/conversation-v0-35-1.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/gptme/conversation-v0-35-1.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/gptme/conversation-v0-35-1.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/gptme/screens/conversation-v0-35-1.yaml",
          "fields": {
            "agent": "gptme",
            "agent_version": "0.35.1",
            "capture": "plain",
            "description": "gptme 0.35.1 with no key asks \"New conversation or load previous?\" with \"* New conversation\" under the mark and \"Load more\". There is no input box. The other nine Linux and macOS labels gave the same bytes. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              61
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "grok",
      "display": "Grok CLI",
      "coverage": [
        {
          "version": "1.1.7",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (host-mode-v1-1-7). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "grok/host-mode-v1-1-7",
          "page": "https://xsavikx.github.io/agent-signals/corpus/grok/host-mode-v1-1-7.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/grok/host-mode-v1-1-7.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/grok/host-mode-v1-1-7.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/grok/screens/host-mode-v1-1-7.yaml",
          "fields": {
            "agent": "grok",
            "agent_version": "1.1.7",
            "capture": "plain",
            "description": "Grok CLI 1.1.7 (superagent-ai/grok-cli) asks a plain question before a key: \"Grok has not been run in <folder> before.\", \"Sandbox mode is only available on macOS Apple Silicon in this version.\", \"Run grok directly on the host for this directory?\" with \"[Y] Yes, remember host mode\" and \"[s] Yes, this session only\", and \"Choice [Y/s]:\". There is no input box. ubuntu-22.04 and ubuntu-26.04 gave the same screen, except the random part of the folder. On macos-15 and macos-26 (arm64) the question is \"Run grok in sandbox mode for this directory?\" with \"[Y] Yes, always in sandbox\", \"[n] No, run on host\" and \"[s] Yes, this session only\". The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [
              "tools/scrub.sh changed the home folder of the runner account to ~, so the line that held the path is shorter",
              "the throwaway folder ~/.cache/agent-signals/run.<random>/work/example is replaced with /work/example, so that line is shorter again"
            ],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              61
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "iflow",
      "display": "iFlow CLI",
      "coverage": [
        {
          "version": "0.5.19",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (base-url-v0-5-19). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "iflow/base-url-v0-5-19",
          "page": "https://xsavikx.github.io/agent-signals/corpus/iflow/base-url-v0-5-19.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/iflow/base-url-v0-5-19.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/iflow/base-url-v0-5-19.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/iflow/screens/base-url-v0-5-19.yaml",
          "fields": {
            "agent": "iflow",
            "agent_version": "0.5.19",
            "capture": "plain",
            "description": "iFlow CLI 0.5.19 with no login shows a framed header with a logo, the version and three tips, and below it a framed form \"OpenAI Compatible API Configuration\" that asks for a base URL, with \"https://api.openai.com/v1\" in its field and \"Press Enter to confirm, Escape to cancel\". A status line with \"glm-4.7 100% context left\" and the work folder are at the bottom. There is no input box for a message. The third tip changes from start to start. On four labels the field shows a cursor \"│\" right after the URL. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [
              "tools/scrub.sh changed the home folder of the runner account to ~, so the line that held the path is shorter",
              "the throwaway folder ~/.cache/agent-signals/run.<random>/work/example is replaced with /work/example, so that line is shorter again"
            ],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              61
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "interpreter",
      "display": "Open Interpreter",
      "coverage": [
        {
          "version": "0.0.56",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (login-v0-0-56). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "interpreter/login-v0-0-56",
          "page": "https://xsavikx.github.io/agent-signals/corpus/interpreter/login-v0-0-56.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/interpreter/login-v0-0-56.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/interpreter/login-v0-0-56.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/interpreter/screens/login-v0-0-56.yaml",
          "fields": {
            "agent": "interpreter",
            "agent_version": "0.0.56",
            "capture": "plain",
            "description": "Open Interpreter 0.0.56 (the Rust version from https://www.openinterpreter.com/install) with no login shows \"Welcome to Open Interpreter\" and a menu with \"> 1. Sign in with ChatGPT\", \"2. Sign in with Device Code\" and \"3. Provide your own API key\", each with a line of help, and \"Press enter to continue\". The layout is the layout of the first screen of Codex CLI. There is no input box. The other nine Linux and macOS labels gave the same bytes. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              61,
              65
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "junie",
      "display": "Junie CLI",
      "coverage": [
        {
          "version": "26.10.27",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (statistics-v26-10-27). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "junie/statistics-v26-10-27",
          "page": "https://xsavikx.github.io/agent-signals/corpus/junie/statistics-v26-10-27.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/junie/statistics-v26-10-27.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/junie/statistics-v26-10-27.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/junie/screens/statistics-v26-10-27.yaml",
          "fields": {
            "agent": "junie",
            "agent_version": "26.10.27",
            "capture": "plain",
            "description": "Junie CLI 26.10.27 (build 3893.6, from the installer https://junie.jetbrains.com/install.sh) with no login draws its logo of slashes and asks \"Share anonymous statistics\" with \"→ Yes, share anonymous statistics\" and \"No, don't share\". There is no input box. Eight more Linux and macOS labels gave the same bytes. On macos-26-intel, some characters of the logo were other characters (\"\\\", \"|\", \"{\", \"(\"): the logo has an animation, and the capture took it in the middle. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              61
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "kilo",
      "display": "Kilo Code CLI",
      "coverage": [
        {
          "version": "7.8.18",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runners ubuntu-24.04 (x64) and macos-26-intel (x64)",
          "notes": "Covers the input box of the first start (idle-v7-8-18), and the empty pane that macos-26-intel gave at the same step (blank-v7-8-18). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "kilo/blank-v7-8-18",
          "page": "https://xsavikx.github.io/agent-signals/corpus/kilo/blank-v7-8-18.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/kilo/blank-v7-8-18.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/kilo/blank-v7-8-18.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/kilo/screens/blank-v7-8-18.yaml",
          "fields": {
            "agent": "kilo",
            "agent_version": "7.8.18",
            "capture": "plain",
            "description": "Kilo Code CLI 7.8.18 on its first start has drawn nothing yet: the 40 lines of the pane are empty. The capture was taken about 30 s after the start, because the scenario steps took longer on this runner. At that time the TUI process had a child \"npm list\" with no tty (fact 57). On the other nine labels of the run, Kilo Code CLI showed its input box (idle-v7-8-18). The screen is the capture of the step 02-after-20s, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner macos-26-intel (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              46,
              57
            ],
            "measured": "2026-10-30T00:00:00Z",
            "negative_control_for": "idle-v7-8-18",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        },
        {
          "key": "kilo/idle-v7-8-18",
          "page": "https://xsavikx.github.io/agent-signals/corpus/kilo/idle-v7-8-18.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/kilo/idle-v7-8-18.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/kilo/idle-v7-8-18.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/kilo/screens/idle-v7-8-18.yaml",
          "fields": {
            "agent": "kilo",
            "agent_version": "7.8.18",
            "capture": "plain",
            "description": "Kilo Code CLI 7.8.18 with no login starts in its input box. The box has the same shape as the box of opencode: a bar \"┃\" at the left, the placeholder \"Ask anything... \"Fix broken tests\"\", the line \"Code · Auto Free Kilo Gateway\" and a rule \"╹▀▀▀\" below it. The footer gives \"tab agents ctrl+p commands\", a tip, and the folder with the version at the bottom. The placeholder is not typed text. Eight more labels gave the same screen, except two parts that change from start to start (the example in the placeholder and the tip) and, on macOS, one space less before the version. On macos-26-intel the pane was still empty (blank-v7-8-18). The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [
              "tools/scrub.sh changed the home folder of the runner account to ~, so the line that held the path is shorter",
              "the throwaway folder ~/.cache/agent-signals/run.<random>/work/example is replaced with /work/example, so that line is shorter again"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              46
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "kimi",
      "display": "Kimi Code CLI",
      "coverage": [
        {
          "version": "2.4.1",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (trust-v2-4-1). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "kimi/trust-v2-4-1",
          "page": "https://xsavikx.github.io/agent-signals/corpus/kimi/trust-v2-4-1.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/kimi/trust-v2-4-1.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/kimi/trust-v2-4-1.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/kimi/screens/trust-v2-4-1.yaml",
          "fields": {
            "agent": "kimi",
            "agent_version": "2.4.1",
            "capture": "plain",
            "description": "Kimi Code CLI 2.4.1 asks the folder-trust question before a login. Between two rules it shows \"Trust this folder?\", the footer \"↑↓ navigate · Enter select · Esc exit\" above the question text, the work folder, two notes, and two options with no numbers: \"Trust and continue\" under the mark \"❯\", and \"Exit\". The other nine Linux and macOS labels of the run gave the same bytes. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [
              "tools/scrub.sh changed the home folder of the runner account to ~, so the line that held the path is shorter",
              "the throwaway folder ~/.cache/agent-signals/run.<random>/work/example is replaced with /work/example, so that line is shorter again"
            ],
            "expect": {
              "dialog": "trust",
              "options": [
                {
                  "label": "Trust and continue",
                  "selected": true
                },
                {
                  "label": "Exit"
                }
              ],
              "question": "Trust this folder?",
              "state": "TRUST"
            },
            "facts": [
              46
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "kiro",
      "display": "Kiro CLI",
      "coverage": [
        {
          "version": "2.37.0",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (login-v2-37-0). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "kiro/login-v2-37-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/kiro/login-v2-37-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/kiro/login-v2-37-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/kiro/login-v2-37-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/kiro/screens/login-v2-37-0.yaml",
          "fields": {
            "agent": "kiro",
            "agent_version": "2.37.0",
            "capture": "plain",
            "description": "Kiro CLI 2.37.0 with no login writes two plain lines: \"Welcome to Kiro CLI, let's get you signed in!\" and \"Press enter to continue to the browser or esc to cancel\". There is no input box. Eight more Linux and macOS labels gave the same bytes. On macos-26-intel, the screen after 20 s was a menu \"You are not logged in. Login now?\" with \"❯ Yes\" and \"No\". The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              61
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "letta",
      "display": "Letta Code",
      "coverage": [
        {
          "version": "0.34.35",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (backend-v0-34-35). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "letta/backend-v0-34-35",
          "page": "https://xsavikx.github.io/agent-signals/corpus/letta/backend-v0-34-35.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/letta/backend-v0-34-35.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/letta/backend-v0-34-35.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/letta/screens/backend-v0-34-35.yaml",
          "fields": {
            "agent": "letta",
            "agent_version": "0.34.35",
            "capture": "plain",
            "description": "Letta Code 0.34.35 with no login shows \"Welcome to Letta Code\", a text about the two backends, and a menu with \"> Sign in with Letta (default)\", \"Proceed locally\" and \"Exit\", each with a line of help, and the footer \"Use ↑/↓ to navigate, Enter to select\". There is no input box. The other five Linux labels gave the same bytes. On the four macOS labels the first line holds the text \"^[[?1;2;4c\": the answer of the terminal to a query of Letta Code, drawn as text. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              61
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "neovate",
      "display": "Neovate Code",
      "coverage": [
        {
          "version": "0.28.5",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (no-model-v0-28-5). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "neovate/no-model-v0-28-5",
          "page": "https://xsavikx.github.io/agent-signals/corpus/neovate/no-model-v0-28-5.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/neovate/no-model-v0-28-5.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/neovate/no-model-v0-28-5.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/neovate/screens/no-model-v0-28-5.yaml",
          "fields": {
            "agent": "neovate",
            "agent_version": "0.28.5",
            "capture": "plain",
            "description": "Neovate Code 0.28.5 with no model shows a long framed list of providers; its top has scrolled out of the pane. Below the list are \"Suggested actions:\" with \"/login - Configure API key for a provider\" and \"/model - Select a model to use\", and below the frame an input line \">\" between two rules, with the status line \"[use /model to select a model] | example | 0.0K | 100% | 🆔 <hex>\". The input line is empty. The other labels gave the same screen, except the eight hex digits after 🆔. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [
              "the eight hex digits after the mark 🆔 in the status line, which change from start to start, are replaced with 00000000"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              61
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "opencode",
      "display": "opencode",
      "coverage": [
        {
          "version": "1.19.5",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (idle-v1-19-5). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "opencode/idle-v1-19-5",
          "page": "https://xsavikx.github.io/agent-signals/corpus/opencode/idle-v1-19-5.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/opencode/idle-v1-19-5.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/opencode/idle-v1-19-5.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/opencode/screens/idle-v1-19-5.yaml",
          "fields": {
            "agent": "opencode",
            "agent_version": "1.19.5",
            "capture": "plain",
            "description": "opencode 1.19.5 with no login and no provider starts in its input box. The logo and \"/update to upgrade to OpenCode 2.0\" are above the box. The box has a bar \"┃\" at the left and a rule \"╹▀▀▀\" below it. It holds the placeholder \"Ask anything… \"What is the tech stack of this project?\"\" and the line \"Build · Big Pickle OpenCode\". The footer gives \"tab agents ctrl+p commands\", a tip to run /connect, and the folder with the version at the bottom. The placeholder is not typed text. The other labels gave the same screen, except two parts that change from start to start: the example in the placeholder, and on macOS one space less before the version, because the home folder of the runner is one character longer there. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [
              "tools/scrub.sh changed the home folder of the runner account to ~, so the line that held the path is shorter",
              "the throwaway folder ~/.cache/agent-signals/run.<random>/work/example is replaced with /work/example, so that line is shorter again"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              29
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "opencode2",
      "display": "opencode 2",
      "coverage": [
        {
          "version": "2.2.5",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (idle-v2-2-5). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "opencode2/idle-v2-2-5",
          "page": "https://xsavikx.github.io/agent-signals/corpus/opencode2/idle-v2-2-5.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/opencode2/idle-v2-2-5.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/opencode2/idle-v2-2-5.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/opencode2/screens/idle-v2-2-5.yaml",
          "fields": {
            "agent": "opencode2",
            "agent_version": "2.2.5",
            "capture": "plain",
            "description": "opencode 2.2.5 (npm @opencode/cli, command opencode2) with no login and no provider starts in its input box, as opencode 1 does. The logo is above a box with a bar \"┃\" at the left and a rule \"╹▀▀▀\" below it. The box holds the placeholder \"Ask anything… \"Fix a TODO in the codebase\"\" and the line \"Build · Big Pickle OpenCode\". Below the box are the folder and \"shift+tab agents ctrl+p commands\", and the version 2.2.5 is at the bottom right. The placeholder is not typed text. Unlike opencode 1.19.5, the screen has no /connect tip and no upgrade note. The other labels gave the same screen, except the example in the placeholder, which changes from start to start. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [
              "the end of the throwaway folder /…/agent-signals/run.<random>/work/example, as opencode 2 shortens it, is replaced with /…/work/example, so that line is shorter"
            ],
            "expect": {
              "box_text": null,
              "dialog": "none",
              "state": "IDLE"
            },
            "facts": [
              63
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured-edited",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "openhands",
      "display": "OpenHands CLI",
      "coverage": [
        {
          "version": "1.16.0",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (settings-v1-16-0). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "openhands/settings-v1-16-0",
          "page": "https://xsavikx.github.io/agent-signals/corpus/openhands/settings-v1-16-0.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/openhands/settings-v1-16-0.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/openhands/settings-v1-16-0.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/openhands/screens/settings-v1-16-0.yaml",
          "fields": {
            "agent": "openhands",
            "agent_version": "1.16.0",
            "capture": "plain",
            "description": "OpenHands CLI 1.16.0 with no configuration. A framed \"Settings\" form (\"Settings Mode: Basic\", \"LLM Provider: Select\", \"LLM Model: Select\", and the buttons Save and Cancel) draws over the main screen. The frame of the input box \"Type your message\" shows at the left and the right of the form, and the form cuts it. The footer gives \"^c Exit esc Cancel\". The box is drawn but covered, and the form is not a numbered dialog, so a reader cannot tell a state from the frame. The six Linux labels gave the same bytes. On the four macOS labels the status line behind the form wraps one word earlier, because the home folder of the runner is one character longer there. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "UNKNOWN"
            },
            "facts": [
              46
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "qoder",
      "display": "Qoder CLI",
      "coverage": [
        {
          "version": "1.1.81",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (login-v1-1-81). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "qoder/login-v1-1-81",
          "page": "https://xsavikx.github.io/agent-signals/corpus/qoder/login-v1-1-81.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/qoder/login-v1-1-81.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/qoder/login-v1-1-81.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/qoder/screens/login-v1-1-81.yaml",
          "fields": {
            "agent": "qoder",
            "agent_version": "1.1.81",
            "capture": "plain",
            "description": "Qoder CLI 1.1.81 with no login shows its logo with \"Qoder CLI v1.1.81\" and \"Not Login Please Auth\", a framed box \"Tips for getting started\", \"Welcome to Qoder CLI\", a rule, and a menu \"Sign in to get started, or exit the application.\" with \"❯ 1. Sign in to continue\" and \"2. Exit the application\". There is no input box. Seven more labels gave the same bytes. On ubuntu-22.04 and ubuntu-22.04-arm, a warning \"Limited color support detected (TERM=screen)\" with two tmux settings is above the menu. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              61
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "qwen",
      "display": "Qwen Code",
      "coverage": [
        {
          "version": "0.26.4",
          "date": "2026-10-30",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41142220844, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (provider-v0-26-4). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "qwen/provider-v0-26-4",
          "page": "https://xsavikx.github.io/agent-signals/corpus/qwen/provider-v0-26-4.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/qwen/provider-v0-26-4.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/qwen/provider-v0-26-4.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/qwen/screens/provider-v0-26-4.yaml",
          "fields": {
            "agent": "qwen",
            "agent_version": "0.26.4",
            "capture": "plain",
            "description": "Qwen Code 0.26.4 with no login. Three notes (a resume tip, \"Auto mode enabled.\" and \"Extensions changed on disk.\") are above a framed dialog \"Connect a Provider\" with four choices: QwenCloud (under the mark \"›\"), Alibaba ModelStudio, Third-party Providers and Custom Provider. The input box is not drawn. The other nine Linux and macOS labels of the run gave the same bytes. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41142220844 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              30
            ],
            "measured": "2026-10-30T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    },
    {
      "name": "vibe",
      "display": "Mistral Vibe",
      "coverage": [
        {
          "version": "3.0.4",
          "date": "2026-10-31",
          "method": "capture-pane -p, 120x40, 20 s after the first start with no login, by scenarios/first-run.sh in the scenarios workflow run 41151440753, on the CI runner ubuntu-24.04 (x64)",
          "notes": "Covers the first screen with no login (welcome-v3-0-4). Not checked: the screens after a login, any turn, a permission dialog, styled captures, and a pane narrower than 120 columns."
        }
      ],
      "screens": [
        {
          "key": "vibe/welcome-v3-0-4",
          "page": "https://xsavikx.github.io/agent-signals/corpus/vibe/welcome-v3-0-4.html",
          "screen": "https://xsavikx.github.io/agent-signals/corpus/vibe/welcome-v3-0-4.screen",
          "meta": "https://xsavikx.github.io/agent-signals/corpus/vibe/welcome-v3-0-4.yaml",
          "source": "https://github.com/xSAVIKx/agent-signals/blob/main/corpus/vibe/screens/welcome-v3-0-4.yaml",
          "fields": {
            "agent": "vibe",
            "agent_version": "3.0.4",
            "capture": "plain",
            "description": "Mistral Vibe 3.0.4 with no key shows one framed line \"Welcome to Mistral Vibe - Let's get you started!\" in the middle of the pane and \"Enter continue\" below it. There is no input box. The other nine Linux and macOS labels gave the same bytes. The screen is the capture 20 s after the start, with no key sent, by scenarios/first-run.sh in the scenarios workflow run 41151440753 on the CI runner ubuntu-24.04 (x64), with a throwaway HOME, no login and no key.",
            "edits": [],
            "expect": {
              "dialog": "none",
              "state": "NO_BOX"
            },
            "facts": [
              61
            ],
            "measured": "2026-10-31T00:00:00Z",
            "pane": {
              "cols": 120,
              "rows": 40
            },
            "provenance": "measured",
            "schema": 1
          }
        }
      ]
    }
  ],
  "format": 1
}
