feat(ci): self-synced internal refs + PR pipeline self-test#10
Merged
Conversation
Two changes that together remove the temp-pin-commit dance and manual test dispatches when changing the harness: 1. The composite action and test harness are now checked out at `job.workflow_sha` — the exact ref of the reusable workflow that is running — instead of a hard @main pin (action) / 'main' default (harness_ref). Workflow, action, and harness always travel together: @v2 callers get exactly v2's action, and a branch dispatch of test.yml tests the branch's in-flight changes as-is. harness_ref remains as an optional override. 2. New ci.yml runs the real prebuild -> emulator-test pipeline (android-x64, quickbit-native, incl. the floor-API emulator) on every PR touching .github/** or test-harness/**. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ion, no persisted credentials on harness checkouts Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…cript input - move-major-tag.yml force-moves vX to any pushed vX.Y.Z tag, so releasing is 'push a semver tag' and @v2 callers follow automatically. - README gains a 'Versioning and releasing' section documenting the major-tag contract, the self-synced internal refs, and the release steps (none of this was written down anywhere). - test.yml now derives test_runner=custom when test_script is set; previously a dispatched script was silently ignored (test_runner stayed 'smoke') and the run passed without executing it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Member
Author
|
Pushed three additions following review:
Plus review nits in the previous commit: After merging: tag 🤖 Generated with Claude Code |
gmaclennan
enabled auto-merge (squash)
June 10, 2026 22:42
…r can't hang the job The fail-fast pidof check had no timeout. When the emulator itself wedges (seen as 'Failed to find process owned resources for puid N', logcat goes silent), the unbounded `adb shell pidof` blocks forever — and because the SECONDS budget is only re-checked at the loop top, the loop never returns there and the job stalls to its 45-min wall clock instead of failing at TIMEOUT_SECONDS. Wrap the call in `timeout`; key the death decision off timeout's exit 124 (it alone means 'adb hung'), since pidof exits non-zero for a dead app too. A wedged emulator now falls through and is bounded by the SECONDS budget; a genuine crash still fails fast. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
`am start -W` blocks until the launch completes; on a flaky API 24 emulator that never returns, hanging the job at line ~20 — before the watch loop, so neither its per-read timeout nor SECONDS budget applies, and the job rode to its 45-min wall clock (seen twice on API 24). Start logcat capture before the launch, then dispatch fire-and-forget under `timeout 60` (drop -W). A stuck launch now falls through to the watch loop, which bounds the wait and reports a clean failure. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
gmaclennan
added a commit
that referenced
this pull request
Jun 11, 2026
…usted install (#12) Closes the supply-chain exposure flagged in the #10 security review: the prebuild jobs check out the caller repo (default persist-credentials: true) and then run `npm install` on the untrusted third-party target module, whose lifecycle scripts could read the caller's GITHUB_TOKEN from $GITHUB_WORKSPACE/.git/config — write-capable in the sibling repos' release runs, which publish the artifacts shipped in the CoMapeo apps. - persist-credentials: false on the caller checkout in prebuild.yml and prebuild-all.yml (it only exists to resolve patches_dir; needs no token). Belt: no token on disk to steal. - npm install --ignore-scripts for the target module. bare-make drives the native build from CMakeLists, so no install-time script is needed (the better-sqlite3 workflow already builds this way). Suspenders. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes the workflow-versioning problem that made validating harness changes painful (temporary action-ref pin commits, manual
test.ymldispatches — see the validation notes on #9).1. Self-synced internal references
The composite action was pinned
@maininside the reusable workflows (a relativeuses:would resolve against the caller's checkout, hence the pin). That decouples the action version from the workflow version:@v2callers run v2 workflows with main's action, and branch dispatches oftest.ymlsilently run main's action instead of the branch's — which is why validating #9 required temporary commits pointing the ref at the branch.The reusable workflows now check out this repo at
job.workflow_sha— the documented context property that, for a job defined in a reusable workflow, is the commit SHA of the reusable workflow file itself (i.e. whatever the caller's@v2/@main/branch ref resolved to) — and use the action/harness from that checkout:Workflow, action, and test harness now always travel together at one SHA.
harness_refstays as an optional override (default now self-sync instead ofmain), andtest.ymlno longer needs to threadgithub.shathrough. This also resolves the earlier "fix reference pinning" / revert churn — there is no longer anything to pin.2. PR pipeline self-test (
ci.yml)Every PR touching
.github/**ortest-harness/**now runs the real pipeline — prebuild (android-x64, quickbit-native@latest) → emulator test, including the floor-API-24 emulator from #9. Combined with (1), the PR's in-flight changes are what actually execute, so changes like #9 get validated automatically with no manual dispatch.This PR validates itself: the
ci.ymlrun on this very PR exercises the self-synced checkout path end-to-end.Android-only by design (the cheap leg, and where toolchain regressions live);
test.ymlremains for manual iOS runs.🤖 Generated with Claude Code