Run failed at 'brew install xcodegen node' AFTER both formulae upgraded
successfully under ARM: brew's 'installed dependents check' then tried to
rebuild gemini-cli (0.40.1 -> 0.46.0, an unrelated dev tool on the runner
that depends on node) and exited 1.
Verified node is NOT used by any step in pr-iphone-deploy.yml — only
xcodegen is. The only node references in the repo are in
scripts/prepare-release.cjs and scripts/verify-admin-web-docker.sh,
neither of which runs in this workflow. Node was a historical leftover.
Drop node from the brew install. No node upgrade = no dependents check =
no gemini-cli rebuild. Also sync AGENTS.md §5 step 4.
Two related fixes to the Install tools / Deploy steps:
1. Rosetta/ARM-prefix conflict (unblocks run #142 failure)
Run #142 failed at 'brew install':
Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)!
The act_runner shell runs under Rosetta 2 on Apple Silicon, but Homebrew
is installed natively in /opt/homebrew (ARM prefix). Brew refuses to mix
architectures and exits 1 — surfaced now because xcodegen/node registered
as outdated and brew tried to upgrade them.
Prefix the brew call with 'arch -arm64' (brew's own suggested workaround)
so the subprocess runs natively regardless of the parent shell's arch.
2. Drop ios-deploy, use xcrun devicectl only
The deploy step previously tried devicectl (WiFi) first, then fell back
to ios-deploy (USB). devicectl handles both network and wired discovery
natively, so the separate USB-fallback tool is unnecessary — removed
from the brew install and the deploy step.
Implication: a devicectl failure = deploy failure (no second tool to
fall back to). Acceptable: devicectl covers both transports.
Also updates workflow name/job labels and the 'Prêt à tester' comment to
drop 'WiFi/USB' wording, and aligns AGENTS.md §5 step 4 (arch -arm64 +
tool list) and step 7 (devicectl only).
Add a paths: filter to the pull_request trigger so the iOS build+deploy
only fires when the PR actually touches:
- tabatago-swift/** (the iOS/watchOS app source)
- .github/workflows/pr-iphone-deploy.yml (this workflow itself)
PRs touching only AGENTS.md, admin-web/, youtube-worker/, supabase/,
docs/, or root config no longer spin up the macOS runner — no point
rebuilding and deploying an unchanged .app.
Including the workflow file itself in paths: ensures a PR that only
edits the workflow logic still triggers it (so this branch's own PR
will run to validate the changes).
10 fixes to .github/workflows/pr-iphone-deploy.yml:
Cache & build hygiene:
- Stop deleting build/spm-cache (was wiped by 'rm -rf build/'); clean only
build/derived. RevenueCat (~1.1 GiB) is finally actually preserved.
- Stop nuking ~/Library/Caches/com.apple.dt.Xcode (slows every next build).
- Drop '|| true' on brew install — fail loudly if brew is down.
- Bump build-deploy timeout 20m → 30m for cold builds.
Secrets:
- New step writes Config/Secrets.xcconfig from Gitea secrets (SUPABASE_URL,
SUPABASE_ANON_KEY, REVENUECAT_API_KEY, POSTHOG_API_KEY) before xcodegen.
Preflight fails loud if a required secret is missing. Heredoc body at
column 0 (xcconfig keys are whitespace-sensitive).
LGTM/KO handling:
- Regex now matches anywhere in body with word boundary: \bLGTM\b / \bKO\b.
'Tested, LGTM!' counts; 'KOM' / 'LGTMX' / 'OK' do not.
- Re-fetch ALL comments each poll (not since_id) to catch edits.
- Squash-merge ({"Do":"squash"}) instead of merge commit.
Workflow structure:
- Add concurrency block (per-PR, cancel-in-progress) — prevents double-merge
and stacked pipelines on successive pushes.
- Remove no-op 'permissions:' block (all mutations go via Gitea API with
PR_API_TOKEN, native GITHUB_TOKEN is never used).
- admin-web-docker.yml: add 'test' job (Node 22, npm ci, tsc --noEmit,
vitest run) gated by the anti-[skip ci] guard, wire needs: [test] on
build-validation and semantic-release, and needs: [semantic-release, test]
on build-and-push. Tests now run as a gate before Docker build validation
on PRs and before semantic-release on main.
- ci.yml: drop the redundant admin-web-test job (now covered by the test
job in admin-web-docker.yml on PRs), remove the admin-web path filter
and output from the changes job, simplify deploy-functions.needs.
- scripts/verify-admin-web-docker.sh: update check_workflow_jobs to expect
4 jobs (test + build-validation + semantic-release + build-and-push) and
check_workflow_needs to expect build-and-push needs [semantic-release, test]
so the verify script stays green with the new job topology.
Bash -e doesn't just kill on pipefail — it exits on ANY non-zero
command. Even without a pipeline, both xcrun devicectl and ios-deploy
return non-zero on failure, killing the script before the exit-code
check.
Fix: wrap both in 'if command; then exit 0; fi' so -e treats them
as condition-tested (no early exit). Fallback now actually runs.
When devicectl fails under bash -e -o pipefail, the pipeline
(xcrun devicectl ... | tail -3) exits non-zero and -e kills
the script before the if-check. The ios-deploy USB fallback
was dead code.
Fix: redirect to temp file, capture exit code explicitly.
No pipeline = pipefail has no side-channel effect.
- Replace browse tab with Supabase-connected explore tab with filters
- Add React Query for data fetching with loading states
- Add 3 structured programs with weekly progression
- Add Supabase anonymous auth sync service
- Add PostHog analytics with screen tracking and events
- Add comprehensive test strategy (Vitest + Maestro E2E)
- Add RevenueCat subscription system with DEV simulation
- Add i18n translations for new screens (EN/FR/DE/ES)
- Add data deletion modal, sync consent modal
- Add assessment screen and program routes
- Add GitHub Actions CI workflow
- Update activity store with sync integration