The avatars are a two-shade gradient with a large white letter, noisy enough to stay near the size the apps make. backend.sh starts an SMP server built from the pinned simplexmq with its [NAMES] resolver on a local registry, and ci_contact claims seeded.testing for its address there; the entries' descriptions now read "CI seeded ..." so the name is also a directory search.
In run 38737084248 the credential scrub made Claude Code 2.1.292 require its whole Bash sandbox (bubblewrap and socat) and force the default permission mode, so every ui call failed. The scrub and bubblewrap are dropped: the PreToolUse guard, which runs in -p sessions, keeps Bash to single ui commands, and now logs each decision outside Claude's directory as evidence. The model is Claude Sonnet 5.5 for the last Claude run the session allows. Third Claude run: [claude-test]
With CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1, Claude Code 2.1.292 runs Bash commands in a PID namespace made by bubblewrap, and in run 38735372615 it exited at startup without it. The Claude job now installs bubblewrap and, before the Claude step, runs ui text in such a namespace, lifting Ubuntu's AppArmor restriction on unprivileged user namespaces only if bwrap can't create one. Second Claude run: [claude-test]
A wrapper in /usr/local/bin runs the helper from the checkout, so Claude's Bash tool finds ui on PATH whatever environment it builds for its shell. First Claude run: [claude-test]
A claude job (environment app-sim-claude, only on workflow_dispatch or a head commit with [claude-test]) starts its own test backend, builds the patched app, runs the scripted onboarding, and gives claude -p (pinned 2.1.292, Claude Haiku 5.5, at most 60 turns and 4 USD) the same search in both layouts to do with the ui helper, reading screenshots. Claude gets Bash, Read and Write only: a PreToolUse hook lets through nothing but single ui commands, credentials are scrubbed from its subprocesses, files are limited to its output directory, no MCP. The job passes when Claude reports CLAUDE-TEST: PASS, and uploads its report, screenshots, transcript and usage (turns, tokens, cost estimated at API prices).
The app is built with DIRECTORY_SERVICE_LINK replaced by the test directory's address (in the workflow only). After onboarding the smoke test types "ci seed" in the default layout (toolbar at the bottom), confirms the first-search alert, and pages with Show more until #ci_group and #ci_channel are both shown. It then checks, without stopping at the first failure: two pages, no further page offered, the Directory header above the results, each avatar's colour, each row's description and Join label, and the member counts. Checks go to checks.txt and the job summary.
A backend job builds the CLI and the directory service without client_library, reused across runs as an artifact named by its sources (plan job, as on the iOS lane). The app job starts a relay and the directory on the preset servers, registers and approves ci_group and ci_channel from a CLI admin, and checks that a search request from a fresh client finds both. The app is not pointed at it yet; its build and desktopTest still run when the backend fails.
Run 38712854507 showed that the released app (v7.1.0-beta.6) has no search field after onboarding: with no chats its left pane is empty and the centre shows "Talk to someone", while the branch shows the search bar in that state. The chat list is now recognised by "Talk to someone", which both show; the release job stops there (onboarding mode), and the branch run again requires the "Search in Directory" row after typing.
xdotool version opens the X display and fails before Xvfb runs ("Can't open display: (null)"), which failed the Install UI tools step in run 38702315040 and skipped the smoke test. dpkg-query prints the installed versions instead.
The branch's Kotlin does not compile yet (DirectorySearch.kt and DirectorySearchView.kt import chat.simplex.res.MR instead of chat.simplex.res.*), so the app job stops before the UI steps. A new release job downloads the desktop .deb of the branch's latest release tag for the runner's Ubuntu and runs the same smoke test on it, which exercises Xvfb, openbox, xdotool and the OCR helper independently of the branch build. The smoke test now checks that the typed text appears in the search field and reports whether the Search in Directory row is shown, since releases before directory search don't have it. This run also checks that the core library cache is hit.
First iteration on f/ci-desktop: the core job builds libsimplex.so with scripts/desktop/build-lib-linux.sh on ubuntu-24.04 (GHC 9.6.3, direct-sqlcipher +openssl, no VLC) and caches it by source hash, with the cabal store cached separately. The app job builds :desktop:createDistributable with Corretto 17 and the repo's assets, runs :common:desktopTest, then starts the app under Xvfb and openbox with software rendering and drives onboarding to the chat list and typing in the search field with the ui helper (xdotool input, tesseract OCR to find text), saving numbered screenshots, the text read from them and a step log as artifacts.