Skip to content

feat(ci): re-enable Swift sidecar CI on macos-26 - #508

Merged
verveguy merged 5 commits into
mainfrom
fabrik/issue-502
Aug 26, 2026
Merged

feat(ci): re-enable Swift sidecar CI on macos-26#508
verveguy merged 5 commits into
mainfrom
fabrik/issue-502

Conversation

@verveguy

Copy link
Copy Markdown
Owner

Closes #502

Summary

native/local-inference/** has had zero CI signal since 2026-05-30 — .github/workflows/swift.yml's job was if: false because GitHub's macos-latest runner image was still macOS 15 + Swift 6.1, while the package requires swift-tools-version: 6.2 / platforms: [.macOS(.v26)]. Every run since, including release tags v0.13.0–v0.13.4, reported skipped.

GitHub's macos-latest migration to macOS 26 completed by ~2026-07-15 (per actions/runner-images#14167), so the original blocker should no longer apply. This PR re-enables the job.

Changes

  • .github/workflows/swift.yml: removes if: false; pins runs-on: macos-26 (an explicit runner label) instead of resuming on the floating macos-latest alias, so a future platform-requirement bump fails loudly instead of silently skipping again; adds an explicit swift build step ahead of the existing swift test step so build vs. test failures are independently visible in the log; rewrites the header comment to describe the current state.
  • .github/workflows/ci-failure-notify.yml: adds "Swift sidecar CI" to the workflow_run.workflows: watch list and updates its header comment, per that workflow's own instruction to do this "when it's re-enabled" (ADR-0298) — closes the gap where a post-merge failure of this job on main would otherwise go unnoticed.
  • native/local-inference/README.md: notes the new CI job in the Tests section, alongside (not replacing) the existing local swift test pre-push instruction.
  • docs/adr/0502-pin-explicit-macos-runner-for-swift-sidecar-ci.md (new) + docs/adr/index.md: records why macos-26 is pinned rather than floating, and why the check is intentionally not yet a required branch-protection status check (this PR's own run is the first live signal from this job in three months, so making it required before that run is observed risks blocking unrelated PRs on a runner/toolchain quirk rather than a real defect).

No test-filtering logic was needed: research established the existing Tests/LocalInferenceTests/ suite already runs entirely on stub .mlpackage fixtures and mock adapters, with no dependency on the ~400 MB CoreML embedding asset or live Foundation Models availability.

How to test

This PR's own Swift sidecar CI check is the test — watch it on this PR to confirm it reports a real pass/fail outcome instead of skipped. If it fails for a runner/toolchain reason unrelated to sidecar code (e.g. macos-26's default Xcode not resolving to Swift 6.2+), that's the User Story 2 / FR-006 fallback path: capture the evidence and update the ADR rather than silently reintroducing if: false.

@verveguy

Copy link
Copy Markdown
Owner Author

🏭 Fabrik — stage: Implement
branch: fabrik/issue-502 | commit: 283b0e7 | main: 4814048 | 2026-08-25 13:49 UTC

Re-enabled .github/workflows/swift.yml by removing if: false and pinning runs-on: macos-26 (an explicit label, not the floating macos-latest alias) to avoid recreating the same silent-skip gap on a future platform bump; wired ci-failure-notify.yml to watch the job per ADR-0298's own instruction; documented the runner-pin and not-yet-required decisions in new ADR-0502. No test-filtering was needed since the existing suite already avoids the 400MB CoreML asset and live Foundation Models. Pushed to fabrik/issue-502; this PR's own CI run is the live verification the research stage flagged as outstanding.


Used 35/100 turns, 2.7M input (64 raw + 2.6M cache-read + 75k cache-write) / 12k output tokens.

@handarbeit-pruefer handarbeit-pruefer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the re-enablement of Swift sidecar CI: .github/workflows/swift.yml (removes if: false, pins macos-26, adds an explicit swift build step), the corresponding watch-list addition in .github/workflows/ci-failure-notify.yml, the README note, and new ADR-0502 plus its docs/adr/index.md entry. The rationale for pinning an explicit runner label instead of floating on macos-latest, and for not yet making the check required, is well-documented and consistent across the workflow header, the ADR, and ci-failure-notify.yml's own comments. (Note: this environment's git history only contains the PR's tip commit with no reachable parent, so this review is based on inspecting the final file contents at HEAD rather than a literal git diff against main.)

One structural gap: swift.yml's on: block declares both push: (with no branches: filter) and pull_request: over the same paths, with no concurrency: group to dedupe them — the exact double-trigger pattern ci.yml's own header comment documents having previously caused two concurrent runs per PR push and had to fix by scoping push to main/maint/** and adding a concurrency group. swift.yml doesn't inherit that fix, so every push to an open PR branch touching native/local-inference/** will kick off two concurrent macos-26 runs (an expensive runner class) for the same commit.

Comment thread .github/workflows/swift.yml
@verveguy

Copy link
Copy Markdown
Owner Author

🏭 Fabrik — stage: Implement (review feedback addressed)
branch: fabrik/issue-502 | commit: 44ca607 | main: 9ba4e04 | 2026-08-25 14:06 UTC

The review thread is resolved. No issue body changes are needed — this was a workflow-file fix, not a spec change.

Fixed the double-trigger gap flagged in review: swift.yml's push now scopes to main/maint/** branches plus release tags (preserving FR-002/SC-002's tag signal) and gained a concurrency group, mirroring ci.yml's documented fix for the identical PR-push double-run pattern. Committed, pushed (44ca6079, required a --force-with-lease since the worktree had been rebased onto a newer main between stage runs), and the review thread is resolved.


Threads addressed:

  • .github/workflows/swift.yml:34 — resolved

Resolved 1 review thread(s) across 2 comment(s).

@handarbeit-pruefer handarbeit-pruefer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the CI re-enablement changes for the Swift sidecar workflow: .github/workflows/swift.yml, .github/workflows/ci-failure-notify.yml, native/local-inference/README.md, and the new ADR-0502 (plus index entry). The working tree reflects the fix for the previously open thread (missing branches:/concurrency: scoping causing duplicate concurrent runs on PR pushes) — the push trigger is now scoped to main/maint/** plus a release-tag glob matching the proven pattern already used by this repo's release.yml, and a concurrency group mirroring ci.yml's established fix has been added. The ci-failure-notify.yml watch-list entry matches the workflow's name: exactly, and the ADR's rationale for pinning macos-26 and deferring required-check status is sound and consistent with the rest of the diff. No new defects found.

@verveguy

Copy link
Copy Markdown
Owner Author

🏭 Fabrik — stage: Review
branch: fabrik/issue-502 | commit: 64a21b5 | main: 9ba4e04 | 2026-08-25 14:09 UTC

Review Findings

Fixed

  • Issue: docs/llms-full.txt was stale — the PR added docs/adr/0502-pin-explicit-macos-runner-for-swift-sidecar-ci.md but never regenerated the aggregated docs file, causing the "Verify llms-full.txt is up to date" check (Docs drift check workflow) to fail on the PR. Fix: ran scripts/generate-docs-llms-full.sh and committed the resulting one-line addition (the new ADR-0502 index row) in 64a21b5.

Verified

  • Rebase: branch was already up to date with origin/main; no conflicts.
  • External review feedback: handarbeit-pruefer's two review passes both came back clean — the double-trigger/concurrency gap it originally flagged was already fixed in a prior Implement-comment cycle (44ca6079), and its second pass found no new defects.
  • swift.yml: push scoping (main/maint/** + release-tag glob) matches the exact glob already used in release.yml; concurrency group naming mirrors ci.yml's established ci-${{ github.workflow }}-... pattern (swift-${{ github.workflow }}-...). Runner pin (macos-26), explicit swift build step ahead of swift test, and header comment are all consistent with the plan and research findings.
  • ci-failure-notify.yml: "Swift sidecar CI" entry matches the workflow's name: field exactly (required for workflow_run matching); header comment updated correctly.
  • docs/adr/index.md: new row correctly ordered by ADR number/date; ADR-0502 content is well-reasoned, cites concrete evidence (actions/runner-images#14167), and correctly documents both the runner-pin and not-yet-required decisions.
  • Branch protection confirmed via gh api .../branches/main/protection: only test (ubuntu-latest) is currently required, consistent with the ADR's claim that Swift CI isn't required yet.
  • This is a docs/workflow-only diff (no .rs files) — CI's Rust test/build-lbug jobs correctly show as skipped per the docs-only fast path (ADR-0322); no local Rust build/test/clippy needed.
  • Pushed 64a21b5.

Not blocking

  • The swift build & test (macos-26) check itself was still in progress on the PR as of this review — that's expected; it's the first live run in three months and per repo policy (and the Plan stage's explicit decision), Review does not wait on or poll CI runs. If it fails for a runner/toolchain reason, that's the documented FR-006 fallback path for a future stage/human to act on, not something to fix here.

PR is ready for human review.

Reviewed the Swift sidecar CI re-enablement PR. Found and fixed one issue: docs/llms-full.txt was stale after adding ADR-0502, causing the docs-drift check to fail — regenerated and committed. Prior external review feedback (double-trigger/concurrency gap) was already resolved. Workflow config, ADR, and index changes all verified consistent and correct. PR is ready for human review.


Used 28/100 turns, 1.2M input (34 raw + 1.2M cache-read + 65k cache-write) / 4k output tokens.

@verveguy

Copy link
Copy Markdown
Owner Author

🏭 Fabrik — stage: Review (review feedback addressed)
branch: fabrik/issue-502 | commit: 64a21b5 | main: 9ba4e04 | 2026-08-25 14:10 UTC

The new comment is handarbeit-pruefer[bot]'s follow-up review confirming no new defects were found — it requires no action. Working tree is clean, no fixes needed, and no issue body changes are warranted since this was just a bot confirmation, not a spec change.

No action taken: the bot review comment reports "No new defects found" and requests nothing. Working tree is clean with all prior fixes already committed and pushed.


Threads addressed:

Resolved 0 review thread(s) across 1 comment(s).

@handarbeit-pruefer handarbeit-pruefer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the re-enablement of Swift sidecar CI: .github/workflows/swift.yml (removes if: false, pins runs-on: macos-26, adds a swift build step, scopes push to main/maint/**+tags, and adds a concurrency group), .github/workflows/ci-failure-notify.yml (adds "Swift sidecar CI" to the watch list), native/local-inference/README.md, and the new ADR-0502 plus its index entry. The previously-flagged double-trigger issue (unscoped push + no concurrency group) is now fixed — push is scoped to main/maint/**/tags and a concurrency group with cancel-in-progress: true is present. The workflow name (Swift sidecar CI) matches what's added to the notify workflow's watch list, and the ADR's reasoning for pinning an explicit runner label and deferring required-check status is coherent and consistent with the code. No defects found.

@verveguy

Copy link
Copy Markdown
Owner Author

🏭 Fabrik — stage: Validate
branch: fabrik/issue-502 | commit: 64a21b5 | main: 9ba4e04 | 2026-08-25 14:20 UTC

No TODO/FIXME markers found. All requirements are verified and the branch is clean. Compiling the final validation report.

Validation Report

Requirements: 7/7 passed

  • FR-001 (swift build on macOS 26/Swift 6.2): Verified — swift.yml's swift-test job runs on runs-on: macos-26 with an explicit swift build step. Confirmed working: the live GH Actions run (32857761649) and a local reproduction on a macOS 26.5.1/Swift 6.3.3 machine both completed swift build successfully.
  • FR-002 (build on push, including release tags): Verified — on.push scopes branches: [main, 'maint/**'] plus a release-tag glob matching release.yml's pattern, in addition to pull_request.
  • FR-003 (test subset without the 400MB asset): Verified — the entire swift test suite (44 tests, 10 suites) ran in both the local and live-CI reproduction without downloading or referencing the real asset; only in-tree stub fixtures were used.
  • FR-004 (no live Foundation Models required): Verified — the FoundationModelsUnavailableTests suite (503-fallback path) passed in both runs; nothing required a live/available Foundation Models instance.
  • FR-005 (real pass/fail, not skipped): Verified — the check reported completed/failure (not skipped) on the PR, for the first time in ~3 months. This is itself the core deliverable of Re-enable Swift sidecar CI: disabled since 2026-05-30, no signal on any release #502.
  • FR-006 (record findings if no runner works): N/A — a working macos-26 hosted runner was confirmed to exist and execute the job; no fallback needed.
  • FR-007 (no asset committed/downloaded): Verified — git diff shows no binary asset added; the workflow does not invoke prepare-embedding-assets.sh.

Test Suite / Live CI Verification

I independently reproduced the Swift job locally (this machine happens to run macOS 26.5.1 / Swift 6.3.3) and cross-checked against the actual GitHub-hosted macos-26 run for this PR's HEAD commit (64a21b54):

Correction to Review stage's assessment

Review stage stated this is a "docs/workflow-only diff... Rust jobs correctly show as skipped per ADR-0322." That's inaccurate: the classifier's CODE_PATTERN includes ^\.github/workflows/ unconditionally (only docs-drift.yml/docs-publish.yml are exempted), and this PR modifies swift.yml and ci-failure-notify.yml. So code_changed=true and the full Rust suite is actually running for real on this PR, not skipped. As of this check, build release artifacts was still in_progress and test (ubuntu-latest) had not yet posted. Per this repo's "never wait on CI" rule, I did not poll it to completion — the engine's wait_for_ci: true gate will catch a failure here and re-invoke Validate if needed. Given the PR contains no actual Rust code changes, a failure is very unlikely, but flagging this correction for accuracy.

Regressions: None detected

No Swift source, fixtures, or Rust code were touched by this PR. The only newly-observed failure (#512) is pre-existing and unrelated to this diff.

Branch State

  • Rebased onto origin/main, up to date, no conflicts.
  • All commits pushed (64a21b54 is on origin/fabrik/issue-502).
  • Working tree clean.

Issues Found

Verdict: READY TO MERGE

Validation passed — all 7 FRs verified via a live reproduction of both the local and GitHub-hosted macos-26 CI run. PR mergeable: MERGEABLE, mergeStateStatus: BLOCKED (required test (ubuntu-latest) Rust check still in progress — this PR touches .github/workflows/*.yml so it triggers the full suite, contrary to Review's docs-only assumption; not polled further per repo policy). Swift CI itself fails on 4 pre-existing, unrelated fixture-loading tests (root-caused, filed as #512) — non-blocking since that check is intentionally non-required.


Used 51/100 turns, 4.7M input (86 raw + 4.6M cache-read + 122k cache-write) / 32k output tokens.

Removes the if: false gate that has left native/local-inference/**
with no CI signal since 2026-05-30 (every run, including release
tags v0.13.0-v0.13.4, reported skipped). GitHub's macos-latest
migration to macOS 26 completed ~2026-07-15, so the original
tools-version blocker no longer applies. Pins the explicit macos-26
runner label instead of macos-latest so a future SDK requirement
bump fails loudly rather than silently skipping again. Adds an
explicit swift build step ahead of swift test so FR-001/FR-003 each
get independent log visibility.

Also wires "Swift sidecar CI" into ci-failure-notify.yml's
workflows: list, per that workflow's own header comment instructing
this "when it's re-enabled" (ADR-0298).
Adds ADR-0502 documenting why the re-enabled swift.yml pins the
explicit macos-26 runner label instead of floating on macos-latest,
and why the check is not yet a required branch-protection status
check. Also updates the sidecar README to mention the new CI job
alongside the existing local swift test instruction.
Review feedback: swift.yml's push trigger had no branches filter and
no concurrency group, so a push to an open PR branch touching
native/local-inference/** fired two concurrent macos-26 runs on the
same commit (one via push, one via pull_request) — the same
double-trigger pattern ci.yml's own header documents having hit and
fixed. Scope push to main/maint/** plus release tags (a plain
branches filter would otherwise exclude tag refs, breaking
FR-002/SC-002's release-tag signal) and add a concurrency group that
cancels a superseded in-flight run, mirroring ci.yml's fix.
Restores the ADR-0502 index row dropped by an --ours conflict
resolution during the rebase onto main (which had landed ADR-0503
adjacent to it in docs/adr/index.md).

@handarbeit-pruefer handarbeit-pruefer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed .github/workflows/swift.yml, .github/workflows/ci-failure-notify.yml, native/local-inference/README.md, and the new ADR-0502 (plus its index entry). Note: this checkout has no main ref or history available (single detached commit, no remote configured), so I reviewed the current file contents directly rather than a diff against main.

The previously-resolved concurrency/push-scoping thread is correctly addressed: push is scoped to main/maint/** plus tags, and a concurrency group with cancel-in-progress: true is present. The ci-failure-notify.yml addition and README/ADR changes match the PR description and are internally consistent.

One real defect: the tags: glob pattern intended to match release tags (**[0-9]+.[0-9]+.[0-9]+*) uses + as if it were a regex quantifier, but GitHub Actions tag filters use glob/minimatch semantics where a bare + outside an extglob group is a literal character. Verified against minimatch that this pattern does not match any of the actual release tags mentioned in the PR's own comments (v0.13.0v0.13.4) or any plausible semver tag — the tags trigger is effectively dead code, silently defeating the stated goal (documented in the workflow's own header) of giving release tags their own CI trigger.

Comment thread .github/workflows/swift.yml
@verveguy

Copy link
Copy Markdown
Owner Author

🏭 Fabrik — stage: Validate (review feedback addressed)
branch: fabrik/issue-502 | commit: 50981d0 | main: 14d20d3 | 2026-08-26 20:25 UTC

Summary

Investigated handarbeit-pruefer's flagged defect: the tags: glob '**[0-9]+.[0-9]+.[0-9]+*' in swift.yml (copied verbatim from release.yml). The bot's reasoning was sound in isolation (verified myself with minimatch — it does return false for real tags), but I found direct empirical counter-evidence in this repo's own run history: two real production releases (v0.13.3, v0.13.4) were genuinely triggered via release.yml's identical on.push.tags pattern, proving GitHub Actions' actual tag-filter matcher treats this pattern differently than the standalone minimatch npm package does. The pattern works in production despite failing under local minimatch testing.

No code change made — changing it would create an unexplained divergence from release.yml's proven, identical pattern. Replied to the review thread with the two run IDs as evidence and resolved it via GraphQL.

PR state: mergeable: MERGEABLE, mergeStateStatus: CLEAN. Working tree clean, nothing to commit or push. Not signaling FABRIK_STAGE_COMPLETE — no explicit user resolution instruction was given.


Threads addressed:

  • .github/workflows/swift.yml:48 — resolved

Resolved 1 review thread(s) across 2 comment(s).

@verveguy
verveguy merged commit 1779e8e into main Aug 26, 2026
19 checks passed
@verveguy
verveguy deleted the fabrik/issue-502 branch August 26, 2026 23:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Re-enable Swift sidecar CI: disabled since 2026-05-30, no signal on any release

1 participant