Commit Graph
65 Commits
Author SHA1 Message Date
spacedandy-agents-simplex 5cd3a2575d ci: say in the iOS and desktop READMEs who the backend state lets someone impersonate, and what keeps the token out of the session's reach
The accepted risk named only the test directory and relay, but the state also holds `ci_admin`, which owns the seeded groups and channels and can post in those the session joins, and on iOS the contacts cialice and Robert. And "no token in reach of its tools" read as structural: the session's Bash inherits the token, and only the guard and the ui helper keep it out of reach.
2026-10-22 14:55:20 +00:00
spacedandy-agents-simplex c229dcd2ca ci: the ui helpers check wait times are numbers, and the Claude guard refuses unquoted glob, brace and tilde, so no file name a session creates can run a command
The guard checks the command text before the Bash tool's shell expands it, and the session can create files with any name in its working directory. So `ui wait x S*`, with a file named `SECONDS[$(…)]` beside it, passed the guard, and the iOS and desktop helpers put the expanded name into `$((SECONDS + …))`, where bash runs the subscript's command substitution, in a process whose ancestors' environment holds the Claude token. Android's helper already checked the number.

Now the desktop helper checks `wait` and `click-text` seconds as Android's does, the iOS helper checks them in `wait_for`, and both guards refuse `*?[]{}~` outside quotes (the plans quote all text, and inside quotes these don't expand).
2026-10-22 14:55:19 +00:00
spacedandy-agents-simplex 2f40c0ee12 ci: carry the Claude jobs' test backend state unencrypted again, as the documented accepted risk
This undoes 65a8b7d2f. Its encryption needed a second secret in the app-sim-claude environment, which the repository's rules for the Claude job don't allow, and until a maintainer created it every iOS and desktop Claude run with the backend stopped before the session. The keys it protected belong to test servers that listen only on the runner's loopback and exist only for the run, so the READMEs' accepted risk stands again as it was.
2026-10-22 07:34:10 +00:00
spacedandy-agents-simplex e7e8b0abf3 ci: the iOS simulator tests set private routing to unknown servers only, so the app can reach the test names server
Master's 3126d9b54 made the iOS app's default private routing "always". Name lookups then go through a preset server, which can't reach the test SMP server on the runner's localhost, so every iOS case that resolves a SimpleX name would fail. The desktop and Android tests already set "unknown" before the first launch; the iOS smoke test now writes the same into the app group's defaults after installing the app, and the app applies it when its chat starts.
2026-10-21 18:31:15 +00:00
spacedandy-agents-simplex 65a8b7d2f5 ci: encrypt the test backend's keys that the Claude jobs carry over, to a key only those jobs hold
The iOS and desktop app jobs saved their stopped test backend (server keys and databases) as a public artifact, so that the Claude job could restart it with the same addresses: anyone signed in to GitHub could download it for a day and act as the test directory or relay while the Claude job ran.

backend-state.sh now packs it as CMS AuthEnvelopedData (AES-256-GCM, RSA-OAEP key transport) to the committed backend-state.crt; the Claude job decrypts it with the environment secret BACKEND_STATE_KEY, given only to that step, so the backend it restarts and the Claude session don't inherit it. Without the secret the Claude job stops at that step, before the Claude session.
2026-10-21 18:11:26 +00:00
spacedandy-agents-simplex 181c92e9a4 fixup! ci: check that a page of chats already listed adds nothing to the search results 2026-10-21 15:27:45 +00:00
spacedandy-agents-simplex a429a5c6f1 ci: check that a page of chats already listed adds nothing to the search results
The iOS and desktop smoke tests looked for the note "All results on this page are
already in your chats", which the app no longer shows. As nothing marks the end of
a search that adds no row, they wait out the request (it times out after 10 s),
retry once if it failed, and check the listed chat, no result row for it, no Open
and no note. The test plans, prompts and READMEs say the same, and New chat's
results as one group with the matching contacts first.
2026-10-21 15:05:46 +00:00
spacedandy-agents-simplex 5f6030568e ci: the desktop ui helper presses one key per xdotool call and checks its coordinates, so no argument can run another command
xdotool key reads a later argument that names one of its commands, exec among them, as that command, and mousemove takes a single word, so "ui key Return exec <program>" or "ui click restore exec ..." ran a program on the runner. The Claude session on the runner is limited to ui commands, and a program could read its token. Key names and numbers are now checked, and keys are pressed one per call.

Review: R1-D1, R1-D2
2026-10-21 11:58:27 +00:00
spacedandy-agents-simplex 1d0524a1c2 ci: the iOS device test plan expects a group joined with /c to show as your chat in the online search
Only a group you were invited to or joined through another link still shows as a result with Open.
2026-10-21 11:02:10 +00:00
spacedandy-agents-simplex dfdfa0383b ci: describe the new online search checks in the iOS simulator and desktop READMEs
Run: 011-search-redesign, slice 6 (feature CI docs)
2026-10-21 05:02:02 +00:00
spacedandy-agents-simplex 6b9e3b3f28 ci: count the prepared channel's subscriber lines by pattern, and close the desktop result menu with a click
The first desktop run showed "2 subscribers" in the toolbar and the banner, which the check counting "1 subscriber" missed, and Escape doesn't close the chat list's menus on desktop.

Run: 011-search-redesign, slice 4 (feature CI fix)
2026-10-21 03:45:56 +00:00
spacedandy-agents-simplex df867281dd ci: check the new online search in the desktop tests
The smoke test's search case and the Claude search prompt check the enable alert (Cancel sends nothing, Enable searches, the other layout doesn't ask), one list with Open and no headers, the load row's count, the Enter key searching the directory with "Connect to …" kept and no names part, Open reaching the prepared channel without an alert and with its subscriber count, the known channel as a chat row, New chat's card, and the right-click menu. Transient screens are read before their screenshots.

Run: 011-search-redesign, slice 4 (feature CI)
2026-10-21 02:30:11 +00:00
spacedandy-agents-simplex 65036d216c ci: let the desktop tests right-click a point, to open a list row's menu
ui right-click <x> <y> clicks with the right button, as ui click does with the left.

Run: 011-search-redesign, slice 4 (CI helper)
2026-10-21 02:30:04 +00:00
spacedandy-agents-simplex 45187c7c30 ci: check the new online search in the iOS simulator tests
The smoke test, the device test plan and the Claude prompt check the enable alert (Cancel sends nothing, Enable searches, later searches don't ask), one list with Open and no headers, the Search key with "Connect to …" kept, Open reaching the prepared channel without an alert and with its subscriber count, the load row's count, loading and retry, New chat's card and the long-press menu. The load row's disabled state is read before the screenshot, which takes long enough for the stopped directory's request to fail.

Run: 011-search-redesign, slice 3 (feature CI)
2026-10-20 23:47:19 +00:00
spacedandy-agents-simplex 4e29980068 ci: let the iOS simulator tests long-press a point, to open context menus
ui long-press <x> <y> touches the point for 1.5 s through AXe's touch command.

Run: 011-search-redesign, slice 3 (CI helper)
2026-10-20 23:47:07 +00:00
spacedandy-agents-simplex b89766128b Merge branch 'master' into f/directory-search
# Conflicts:
#	apps/ios/spec/api.md
#	apps/multiplatform/spec/api.md
#	scripts/ci/desktop-linux/claude-test.sh
2026-10-20 21:41:30 +00:00
spaced4ndy 9a1d3e4969 ci: test the Android app in an emulator on GitHub's runners (#7786) 2026-10-20 16:55:54 +00:00
spaced4ndy 5834179be6 ci: start app tests only by hand (#7777) 2026-10-20 16:48:47 +00:00
EvgenyandEvgeny @ SimpleX Chat 16618c26cc ci: reduce runners (#7778)
* ci: reduce runners

* ram disk in mac tests

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-19 22:36:12 +01:00
EvgenyandEvgeny @ SimpleX Chat 46b2cf9f85 nodejs: add tests to library (#7694)
* nodejs: add tests to library

* new tests

* remove message splitting

* fix race

* docs

* replace extract-zip with yauzl that it wraps (high severity issue)

* fix ci tests

* skip server tests on macos and win unless SMP_SERVER is set

* fix win test

* fix win test

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-19 19:49:44 +01:00
spacedandy-agents-simplex 709f016c92 ci: pick the desktop test server's "To resolve names" role by the menu's first item
That menu opens over the server address's QR code, where OCR can miss its "yes" (run 39242250150 failed its setup three times on it), so the smoke test finds the menu's first item, which repeats the field's value and reads well, and clicks the row under it. The check that the role is now yes stays.

[claude-test:desktop] [ci-backend]
2026-10-19 11:21:56 +00:00
EvgenyandEvgeny @ SimpleX Chat 1cbbe82517 ci: fix mac library build to sign and notarize library (#7765)
* ci: fix mac library build to sign and notarize library

* script

* sign and notarize to test

* remove test build

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-19 11:59:43 +01:00
spacedandy-agents-simplex 6b02b1b775 ci: say in the app CI READMEs that the backend-state artifact is public, and why that is accepted
The artifact carrying the app job's stopped test backend to the Claude job holds its databases and server keys, which anyone signed in to GitHub can download for the day it is kept. The READMEs now say so, what someone could do with it, and why encrypting it isn't possible under the Claude job's one-secret rule.

Review R1-1, run 008-dirsearch-known-chats

[app-ci:ios] [ci-backend]
2026-10-19 10:49:13 +00:00
spaced4ndy 7ac7d00025 ci: start the app tests from run tags only on f/ branches (#7768) 2026-10-19 10:25:26 +00:00
spacedandy-agents-simplex 8a9628bd9c ci: start the app job's test backend again in the Claude jobs, as the app points at its directory
The app is built in the app job with that job's backend's directory address in DIRECTORY_SERVICE_LINK, and since master moved Claude into its own job, that job started a new backend with another address. The app job now uploads its stopped backend's work dir (without the binaries), and the Claude job restarts it with a new backend.sh resume: the same servers' keys and databases, so the same addresses. The relay, directory, names server and contacts start through the functions start uses, split out of it. The iOS Claude job's smoke test also gets BACKEND_DIR, as the app job's does.

[claude-test] [ci-backend]
2026-10-19 10:24:43 +00:00
spacedandy-agents-simplex 547c8ac18b Merge branch 'master' into f/directory-search
# Conflicts:
#	.github/workflows/desktop-linux.yml
#	apps/ios/SimpleX.xcodeproj/project.pbxproj
#	apps/multiplatform/product/gaps.md
#	apps/multiplatform/spec/README.md
#	apps/multiplatform/spec/client/navigation.md
#	scripts/ci/desktop-linux/README.md
#	scripts/ci/desktop-linux/claude-test.sh
#	scripts/ci/ios-sim/README.md
#	scripts/ci/ios-sim/backend.sh
#	src/Simplex/Chat/Library/Commands.hs
2026-10-19 10:24:36 +00:00
spaced4ndy 35bc0b66d9 ci: app test workflows save no caches, reuse their builds as artifacts, and run Claude in its own job (#7767) 2026-10-19 09:31:38 +00:00
spacedandy-agents-simplex 0808da23fc ci: check in the desktop smoke and Claude tests that known directory results are chats, and the note for a page of them
After joining ci_channel, the scripted search case checks in both layouts that searching its name shows the note "All results on this page are already in your chats" and no Directory row, and that a search the local list doesn't match shows ci_channel as a chat row that opens it, not "#ci_channel" with "Join channel"; New chat shows it as a contact-style row. The Claude search test's part C expects the same.

Run: 008-dirsearch-known-chats, slice 5

[claude-test] [ci-backend]
2026-10-19 09:31:12 +00:00
spacedandy-agents-simplex ce30e9bd6c ci: check in the iOS smoke test and plan that known directory results are chats, and the note for a page of them
After joining ci_cards, the smoke test expects the note "All results on this page are already in your chats" for its name, and, in both layouts and in New chat, that a search the local list doesn't match shows ci_cards as its chat row, which opens the channel, not "#ci_cards" with "Join channel". The plan gets U4 and W12 and the new U2, the prompt describes known entries and the note, and the Claude scope runs the changed cases (Haiku 5.5, 300 turns, 3 USD).

Run: 008-dirsearch-known-chats, slice 4
2026-10-19 09:23:26 +00:00
EvgenyandEvgeny @ SimpleX Chat a766d0af0f ci: package releases with drafts in simplex-chat-libs (#7754)
* ci: package releases with drafts in simplex-chat-libs

* test release

* core: 7.1.0.12

* packages: release nodejs and python libraries

* fixes

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-19 07:50:09 +01:00
EvgenyandEvgeny @ SimpleX Chat 5a5a927821 ci: reduce the number of runners (#7750)
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-18 11:40:08 +01:00
EvgenyandEvgeny @ SimpleX Chat 9a90d8e230 ci: cache build artifacts for faster builds (#7730)
* ci: cache build artifacts for faster builds

* test build

* compression

* fix macos-latest

* debug build

* better caching

* test cache

* update build

* test cache

* ci: check toolchain restore

* ci: remove Windows toolchain cache

* ci: skip tests on macOS Intel

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-17 17:12:08 +01:00
spacedandy-agents-simplex f6f38a4122 ci: tell the iOS Claude session that a new profile copies the names server
N7 needs a profile that resolves no names, but the second profile copied the first one's names server, so names still resolved (run 39004554089).
2026-10-17 07:29:44 +00:00
spacedandy-agents-simplex a7886e4eab ci: open another chat before the desktop Claude test's name search
Desktop always lists the chat open in the right pane, so with ci_channel open its Directory row was rightly hidden and step C.3 had nothing to click (run 39001925386). Also runs the iOS names session again: that run's backend stopped when the directory could not connect to a channel's link.

[claude-test] [ci-backend]
2026-10-17 04:58:29 +00:00
spacedandy-agents-simplex 3e3e27da38 ci: scope the iOS Claude sessions to the names cases again, with the setup step fixed
One-hand: the names setup, N1-N11, the New chat cases with names and the full search in both lists, checking that a row opened from goes away; N11 uses #cinews_weekly so the top bar's N1 still finds cinews unopened. Top bar: N1, N4 and the full search on the chat list.

[claude-test] [ci-backend]
2026-10-17 04:16:02 +00:00
spacedandy-agents-simplex 868033ce68 ci: say in the iOS prompt that a server's roles show once it is used for new connections
A session found no role pickers on the names server it added, so no name resolved and the names cases were blocked (run 38993332306); a later session added the server twice.
2026-10-17 04:15:55 +00:00
spacedandy-agents-simplex b3d5fa92b7 ci: check in the desktop Claude test that a joined channel's Directory row goes away 2026-10-17 04:15:53 +00:00
spacedandy-agents-simplex 0c66b087ad ci: check in the iOS smoke test that a joined channel's Directory row goes away
The smoke test searches ci_cards by its name, joins it from its Directory row, and then expects the chat in the results and no Directory row for it.
2026-10-17 04:15:52 +00:00
spacedandy-agents-simplex 7165bb7d02 ci: base the desktop search test's part C on what the chat list lists
ci_channel's description matches "seed", so the list showed it and the step's premise was wrong; a name narrows the list instead. Desktop keeps the open chat in the filtered list, so "No chats found" can't be required while a chat is open (run 38994540038).
2026-10-17 03:01:18 +00:00
spacedandy-agents-simplex 03f488c85c ci: add joining and duplicate checks to the desktop Claude search test
Part C joins a channel from its Directory row, then checks that the joined chat is not listed again by the directory when the local list shows it, that it is when the list doesn't, the empty result, an unregistered name, and that only the Search key resolves names. The session gets 120 turns for it.

[claude-test:desktop] [ci-backend]
2026-10-17 02:20:28 +00:00
spacedandy-agents-simplex 1f702e29a3 ci: scope the iOS Claude sessions to the names cases and the full search
One-hand: the names setup, N1-N11, the New chat cases with names, the full search in both lists, G3 again, and whether a row stays next to the chat opened from it; top bar: N1, N4 and the full search on the chat list.

[claude-test:ios] [ci-backend]
2026-10-17 02:02:15 +00:00
spacedandy-agents-simplex 78be139bc8 ci: fit the iOS plan's D15 and W4 to both layouts, and time held searches in the prompt
D15 said the search bar is above the onboarding pages, which holds only with the top bar; W4 assumed a contact matches. A session tapped the pencil for G3 after the held search had already failed (app log), so the prompt asks for the action as the next command.
2026-10-17 02:02:00 +00:00
spacedandy-agents-simplex 5399b6e133 ci: scope the iOS Claude sessions to the online search plan without names
One-hand: the chat list, directory results, de-duplication, New chat and regression cases; top bar: the cases this layout draws differently. The names cases run in a separate session.

[claude-test] [ci-backend]
2026-10-16 22:36:34 +00:00
spacedandy-agents-simplex f1e4b45701 ci: give the desktop smoke test's time with the backend's searches 2026-10-16 22:36:14 +00:00
spacedandy-agents-simplex b8fab259da ci: describe the desktop search checks in the README
Runs the scripted tests of both apps with the test backend: [app-ci] [ci-backend]
2026-10-16 21:02:15 +00:00
spacedandy-agents-simplex 049cff88c7 ci: restore the desktop Claude search test
With the test backend, the Claude job builds the app against the test directory, sets it up at the chat list and gives Claude the online search test; without it, the onboarding path stays.
2026-10-16 21:02:01 +00:00
spacedandy-agents-simplex bad6eda33d ci: point the desktop app at the test directory and restore the smoke test's searches
With the test backend, the app is built against the test directory's address, and the smoke test runs a new search case: after the backend case's checks, in both layouts, "Search in Directory" and the full search with a SimpleX name, and with the toolbar at the bottom the full search in the New chat sheet.
2026-10-16 21:01:30 +00:00
spacedandy-agents-simplex 0176a83299 ci: restore the desktop backend's search request probe
A fresh client sends the directory the search the app sends and follows the cursor to the last page: each result must arrive once with its whole image, over at least two pages. The message search stays.
2026-10-16 21:01:29 +00:00
spacedandy-agents-simplex 37616294a4 ci: describe the iOS directory search checks in the README 2026-10-16 21:01:28 +00:00
spacedandy-agents-simplex 183d0d5356 ci: restore the iOS device test plan for online search, with its prompt and scope
The Claude sessions run the online search plan again: the cases, what each session covers per layout, the prompt's directory search, names and report sections, and the session's start state after the smoke test's searches.
2026-10-16 21:01:26 +00:00