Skip to main content

Continuous integration, and the two desktop gates

Status: T12.4, revised for Draft 2.18 · For the repository owner

The repository lives at github.com/SvatahLabs/yam and GitHub Actions is the only CI. .github/workflows/ci.yml runs on every push and pull request; .github/workflows/release.yml runs on a tag or a manual dispatch and is the only place a publish can happen (scripts/publish.mjs, T8.5).

1. What runs on GitHub's hosted runners, today

JobRunnerWhat it proves
workspaceubuntu, macOS, Windowsthe six-command contract, the licence check, compatibility, privacy mode, the examples (REQ-NFR-7)
quick-startubuntuthe ten-minute quick start, timed, and the committed bindings reproduce (REQ-PKG-2)
runtime-conformanceubuntu with a JDKthe Java runtime writes the published schemas and agrees with the fixture (REQ-STD-3)
clients-smokeubuntu with a JDK and a Pythonthe generated clients have not drifted and drive a live service (REQ-SDK-1, 2)
app-installersubuntu, macOS, Windowsthe app packages on all three and the packaged app opens a project (REQ-ADE-6)
desktop-conformance (windows, uia)Windowsthe Windows UI Automation gate (REQ-ADP-6)
desktop-conformance (macos, ax)macOSexits 2 on a hosted runner — see §3
grounding-evalubuntureplays the committed answer cache; never spends
model-evalsubuntu, on the schedulethe grounding and healing numbers against the real gateway, with the repository's credential

Nothing here needs a machine the owner provides, except the one leg below.

2. The macOS AX gate needs a self-hosted runner

The macOS Accessibility permission is granted per application, by a person, in System Settings, and recorded in a database that System Integrity Protection guards. No command grants it and tccutil only resets. A hosted macOS runner is a fresh virtual machine with nobody to click the switch, so scripts/desktop-conformance.mjs exits 2 there, and the workflow treats exit 2 as "this runner cannot host the gate" and passes the leg with a message. Exit 1, "the adapter is not conformant", always fails it (T7.2).

Attaching one Mac turns the leg green. About twenty minutes:

  1. In GitHub: the organisation's Settings → Actions → RunnersNew runner → macOS, arm64 (or x64 on an Intel Mac). Give it the labels self-hosted, macOS and ax-gate. GitHub shows the download and configure commands; keep the page open, the token is short-lived.

  2. On the Mac, in a graphical session as the logged-in user, run the commands GitHub showed to download and configure the runner. Do not use a container and do not run it as a launch daemon or over SSH: a process outside the user's Aqua session cannot open a window an accessibility client can read (LLD §7.5, P8-F1). To survive a reboot use a launch agent (~/Library/LaunchAgents/), leave the machine logged in, and keep the display awake with caffeinate -disu in the same session. A locked display is not a usable one, and yam surface doctor --adapter ax says so.

  3. Grant Accessibility to the application that runs the runner (Terminal, or whatever started run.sh): System Settings → Privacy & Security → Accessibility. Then, in that same terminal:

    node packages/cli/dist/bin.js surface doctor --adapter ax

    It must say ax/accessibility granted and ax/session N application(s) own a window. If it says refused, the grant is on the wrong application: it follows the process that runs the gate, not the runner directory.

  4. Screen Recording is separate and optional. The same pane, Screen & System Audio Recording. Without it the adapter still reads the accessibility tree and the gate is still conformant; only screenshots are missing, and surface doctor reports that rather than failing.

  5. Point the leg at the runner. In ci.yml, the macOS entry of desktop-conformance's matrix names its runner; change its os from macos-latest to the label set [self-hosted, macOS, ax-gate] and the next push runs the gate there. tools/repo-checks/test/ci.test.ts still requires the two legs to have different hosts and to run no test suite beside the gate (T12.1).

3. What to record when the runner exists

Both desktop legs publish an artifact:

LegArtifactWhat to read first
macOS, axreports/adapter-ax.mdthe Bridge line: nodes, wall time, ms per node, and the one-minute load average with the CPU count. A per-node cost without the load beside it is not a number (LLD §7.5).
Windows, uiareports/adapter-uia.mdthe same line, and whether any variant was retried

Paste the two reports into the current phase's progress record with the runner's model and OS version beside them. A conformance number whose machine is not named cannot be compared with anybody's.

4. Status

  • The Windows UIA gate and the three installer legs run on hosted runners as soon as the repository is pushed to GitHub (T13.1, T13.2).
  • The macOS AX gate has been run by hand on the implementer's host and is conformant; reports/adapter-ax.md is that run. It goes green in CI when the owner attaches the runner above.