ci: run the whole plan again with a todo checklist, per-layout entries and run 2's lessons [claude-test]

Run 38734049940 covered the plan in both layouts but left D11 unrecorded and W3 unrun after a compaction, and its D6/W6 taps met entries an earlier case had joined, so they showed the open alert instead of the join flow. Now report.md starts as a checklist of every case marked todo, the session re-reads it after a compaction, claude-scope names per layout the entries the joining cases use, and the session gets the link to paste. The prompt also says how to hold a search open (stop the directory), tap ambiguous labels by position, clear the field (focus, then Cancel), and that the keyboard capitalizes and autocorrects.
This commit is contained in:
spacedandy-agents-simplex committed 2026-10-15 14:37:14 +00:00
1 parent 10304e1fa3
commit b5656c56c7
3 files changed
+18 -10

No files matched your search

+12 -9
View File
@@ -11,26 +11,29 @@ You are testing the SimpleX Chat iOS app in an iPhone 17 simulator (iOS 26.5, sc
- **Layouts.** With the one-hand UI (reachable toolbar, the default) the chat list is drawn from the bottom up: the search field is near the bottom (y about 754), the list tags ("Add list" when there are no lists) or the online search rows are just above it, and chats and results stack upwards from there. With the top bar the search field is at the top, the tags above it, and "Search in Directory" and "Connect to …" appear below it. Stay in the layout the session names; the app starts in it, and `ui relaunch` keeps it.
- **Positions.** "Above" means a smaller y. Judge order and position from the tree's coordinates, and look at a screenshot when you judge layout (truncation, overlap, avatars).
- **The search field** has no label; tap it with `ui tap-value "Search or paste SimpleX link"` when empty, or by its text. To clear it, tap "Cancel" next to the field (it also hides the keyboard): in an earlier run, tapping the "Close" image inside the field did not clear it, and the next text was typed after the old one. Before typing, check that the field shows its placeholder; after typing, check the field's value in the tree, as the keyboard may capitalize or correct words. The keyboard's Search key is `ui key return`; keyboard keys are below the screen and not listed in the tree.
- **Pasting** (C4, W3): `ui clipboard "<link>"`, tap the empty field once to focus it and once more to open its menu, then `ui tap Paste`.
- **Directory search.** "Search in Directory" (a row) searches the directory; the first time after the hints are reset the alert "Search in Directory?" asks first, with "Cancel", "Search" and "Search and don't show again" (`ui tap Search` taps the alert's button). Results come as a heading `Heading "Directory"`, then per entry an avatar image, `"#name"`, the description, "N members" or "N subscriber(s)", and "Join group" or "Join channel" as separate texts. A failed search shows "Search failed, tap to retry"; more results show "Show more". A search takes a few seconds (it sets up an encrypted connection) and times out after 10 s. A channel's row shows the subscriber count the directory publishes for it (`publicMemberCount`, 1 for the seeded channels), not the listings' members column, which counts every member record (owner, relay, directory: 3), so the two differ by design.
- **The search field** has no label; tap it with `ui tap-value "Search or paste SimpleX link"` when empty, or by its text. To clear it, tap the field so it is focused, then "Cancel" next to it ("Cancel" exists only while the field is focused; it also hides the keyboard); tapping the "Close" image inside the field did not clear it in an earlier run. Type text as one quoted argument (`ui type "ci seed"`). The keyboard capitalizes the first letter and autocorrects words (an earlier run saw "ci" become "Ci" and a typed name become another word when a button was tapped), so check the field's value in the tree after typing, and before typing check that the field shows its placeholder. The keyboard's Search key is `ui key return`; the keyboard's keys are below the screen and not listed in the tree, and the screenshots do not show the keyboard.
- **Pasting** (C4, W3): `ui clipboard "<link>"` with the link given under "This session", tap the empty field once to focus it and once more to open its menu, then tap its "Paste" item (two elements carry that label: use `ui tap-xy` on the one `ui find Paste` shows in the menu).
- **Directory search.** "Search in Directory" (a row) searches the directory; the first time after the hints are reset the alert "Search in Directory?" asks first, with "Cancel", "Search" and "Search and don't show again" (`ui tap Search` taps the alert's button). Results come as a heading `Heading "Directory"`, then per entry an avatar image, `"#name"`, the description, "N members" or "N subscriber(s)", and "Join group" or "Join channel" as separate texts. A failed search shows "Search failed, tap to retry"; more results show "Show more". A search takes 1–2 s here (it sets up an encrypted connection) and times out after 10 s. A channel's row shows the subscriber count the directory publishes for it (`publicMemberCount`), not the listings' members column, which counts every member record (owner, relay, directory), so the two differ by design.
- **Order with the one-hand UI.** Results read from the bottom like the chats: the first result is nearest the search field, each "Show more" adds its page above the earlier ones, and "Show more" sits right under the "Directory" heading. That is the current design; what must hold is that the heading is above all of the part's rows.
- **Disabled elements** end with "disabled" in the tree. To see "Show more" while its page loads, stop the directory first (`ui directory stop`), tap "Show more" and look at it within 10 s, then start the directory again.
- **Disabled elements** end with "disabled" in the tree.
- **Holding a search open.** A search answers in 1–2 s here, too fast to see its loading state. For the cases about a search in progress (D1, D12, D13, W9, G3, and "Show more" while loading in D7), stop the directory first (`ui directory stop`): the search then waits 10 s before it fails. Start it again afterwards.
- **Ambiguous labels.** When `ui tap` says several elements match a label (seen for "Paste", "Channels", "Account"), tap the one you mean with `ui tap-xy` at its centre, taken from `ui find`.
- **Hidden elements.** The tree always contains the closed user picker: the profile name, "Create SimpleX address", "Chat preferences", "Your chat profiles", "Use from desktop", "Settings", at coordinates on the screen even while it is hidden. Do not tap them unless you opened the picker by tapping your profile image in the toolbar (`Image "Account"`, 32 x 32; tap its centre with `ui tap-xy`).
- **Settings → Reset all hints:** open the picker, "Settings", scroll to the bottom, the app version row ("v…"), "Developer", "Reset all hints". Go back with the navigation back buttons and close Settings by swiping it down.
- **New chat** is the "Compose" button (the pencil) in the toolbar.
- **Counting requests.** `ui requests` tells how many directory searches the app sent; compare before and after an action to prove that something was or was not sent (C6, C9, D12, D13).
- **The test directory** can be stopped and started (`ui directory stop|start`). Use it instead of turning networking off (D8, D9; the simulator shares the runner's network). After `ui directory start`, wait about 15 s before searching again; while it is stopped, searches fail after 10 s.
- **Text size** (D3): `ui text-size accessibility-large`, and back to `ui text-size medium` afterwards. Only one phone size is available.
- **Joining.** Tapping a directory row starts the usual join flow; joining a channel works (the test relay is online), joining a group may stay "connecting". Joined chats then appear in the chat list, and the profile is no longer "without conversations".
- **A second profile** (D14, and D15 once the first profile has chats): open the picker, "Your chat profiles", add a profile; a new profile has no conversations. Switch back to `citester` when done.
- **Joining.** Tapping a directory row of an entry the profile does not know yet starts the join flow (an alert to join; confirm it to join); joining a channel works (the test relay is online), joining a group may stay "connecting". A joined or connecting entry is known: tapping it shows an alert to open it ("Open channel", "Open group") instead, and a sheet behind that alert stays until you choose "Open". So each case that joins uses the entry named for it under "This session", which no earlier case has touched. Joined chats appear in the chat list, and the profile is no longer "without conversations".
- **New chat and the pencil.** With the top bar the pencil is hidden while the search field is focused; tapping the "Search in Directory" row hides the keyboard, and the pencil shows again while that search runs.
- **A second profile** (D14, and D15 once the first profile has chats): open the picker, "Your chat profiles", add a profile; a new profile has no conversations. Switch back to the first profile when done.
- **If the app gets stuck**, `ui relaunch` restarts it (search text and results are cleared, everything else stays).
- Waiting: prefer `ui wait <text> <secs>` over repeated trees.
## How to run the cases
- Run each case of the session's list, in the plan's order unless a case needs another first (for example D15 needs a profile without conversations, U1 and U2 need a joined channel from D6).
- For each case, do what the plan says, decide pass or fail against the plan's "Expect" column, and take at least one `ui shot` at the moment that shows the result, named after the case and layout, for example `ui shot D2-reachable`.
- For each case, do what the plan says, decide pass or fail against the plan's "Expect" column, and take at least one `ui shot` at the moment that shows the result, named after the case and layout without a number, for example `ui shot D2-reachable` (the helper numbers the files).
- Pass only what you saw: quote the evidence (element labels, values and coordinates from the tree, or what a screenshot shows). If an expectation cannot be checked here, say which part and why, and mark the case passed for the parts you checked only if those parts are the substance of the case; otherwise skipped.
- **Skip** the N cases (no name-resolving server here), and any case that needs something this runner lacks, saying exactly what is missing. Known: U3 (needs a listed group joined through another link), W7, W8 and G1 (need contacts with SimpleX names), W10 (needs a notification from another profile), W11 unless "Archived contacts" is shown. Do not skip a case only because it takes several steps.
- **The Directory header** must be above its results in this layout (D2, D4, D8 and every screen with results): record the heading's y and the first and last result's y each time, and note whether `Heading "Directory"` comes before or after the result texts in the tree's order.
@@ -39,7 +42,7 @@ You are testing the SimpleX Chat iOS app in an iPhone 17 simulator (iOS 26.5, sc
## The report
Write `report.md` in the current directory as you go: create it after the first case and update it after every case, so a session that is cut short still leaves its results. Its sections:
Write `report.md` in the current directory as you go, so a session that is cut short still leaves its results. **Before the first case, create it with the Results table already holding one row for every case of the session's list, Result `todo`**, and fill a row in as soon as its case is done. Before each case, and always after the conversation has been compacted, read `report.md` to see which cases are left (and `prompt.md` for anything else you need). The session is finished only when no row says `todo`. Its sections:
1. `# Device test report: <layout>` and one line on the app state at the start.
2. `## Results`: a table with one row per case of the session's list: `| ID | Result | Evidence | Screenshots |`, Result being pass, fail or skipped (with the reason).
@@ -48,4 +51,4 @@ Write `report.md` in the current directory as you go: create it after the first
5. `## Findings`: app bugs, each with steps, what you saw, what you expected, screenshots.
6. `## Harness notes`: anything about `ui` or the runner that got in the way.
End the session by making sure `report.md` is complete; your final message is a three-line summary: passed, failed and skipped counts, and the most important finding.
End the session by making sure `report.md` is complete and no row says `todo`; your final message is a three-line summary: passed, failed and skipped counts, and the most important finding.
+3
View File
@@ -1,6 +1,9 @@
# What claude-test.sh runs: one Claude session per layout (reachable, top), the plan's cases, and each session's bounds.
# entries-<layout> tells that session which directory entries its joining cases use, so none meets an entry already known.
model: claude-haiku-5-5
layouts: reachable top
cases: all of the plan's cases (C1-C9, D1-D15, U1-U3, N1-N11, W1-W11, G1-G4), skipping those named under "How to run the cases"
entries-reachable: D6 joins ci_channel, which U1 then searches by name and U2 by "seed channel"; W6 joins ci_avatar_c2; D11 searches "private" (only the local chat "Private notes" has it); D14 and D15 use a second profile you add
entries-top: D6 joins ci_avatar_c1, which U1 then searches by name and U2 by "avatar channel 1"; W6 joins ci_avatar_c3; D11 searches "private"; D14 and D15 use the second profile from the earlier session (add one if it is missing)
max-turns: 700
max-budget-usd: 10
+3 -1
View File
@@ -60,8 +60,10 @@ write_prompt() {
echo
echo "- Layout: $(layout_name "$layout")."
echo "- Cases: $cases."
echo "- Entries to use: $(scope "entries-$layout")."
echo "- Link to paste (C4, W3): $(cat "$BACKEND_DIR/directory-link") (the test directory's address)."
if [ -z "$previous" ]; then
echo "- At the start: the smoke test onboarded the profile citester, which has no conversations, and searched the directory once, choosing \"Search\" in the alert."
echo "- At the start: the smoke test onboarded a profile (typed as \"citester\"; the keyboard may have autocorrected the name), which has no conversations, and searched the directory once, choosing \"Search\" in the alert."
else
echo "- At the start: an earlier session ran the cases in $(layout_name "$previous") on this app, so the profile may have chats, other profiles may exist and hints may be changed; look at the state first."
fi