Skip to content

ci: add opt-in fork-friendly release ops (signing, publishing, fork sync) - #407

Open
arcaven wants to merge 8 commits into
Zious11:developfrom
ArcavenAE:feat/fork-friendly-release-ops
Open

ci: add opt-in fork-friendly release ops (signing, publishing, fork sync)#407
arcaven wants to merge 8 commits into
Zious11:developfrom
ArcavenAE:feat/fork-friendly-release-ops

Conversation

@arcaven

@arcaven arcaven commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Offers back the release-ops pipeline the ArcavenAE fork has been running in production since 2026-07-15. Everything is inert by default: with no repository variables set, every job either skips at scheduling time or never triggers, and CI is unaffected — no Apple Developer account, secrets, or tap repo are required to host these files. The design is ported from jira-cli's fork-friendly release-ops (docs/specs/fork-friendly-release-ops.md there), where the same pattern already lives upstream.

What this adds

File Purpose Inert unless
.github/workflows/sign-and-publish.yml Sign + notarize macOS binaries on five channels (develop push → wirerust-a, v*-dev.*wirerust-d, v*-beta.*wirerust-b, v*-rc.*wirerust-rc, stable v*wirerust), publish to a Homebrew tap vars.SIGNING_ENABLED == 'true' (+ vars.HOMEBREW_TAP_REPO for tap jobs)
.github/workflows/backfill-release.yml Build + release an existing tag that has no GitHub Release; optional sign/publish manual workflow_dispatch only; sign/tap jobs var-gated
.github/workflows/sync-upstream.yml Scheduled fork→upstream merge (main/develop/factory-artifacts) with protected-file auto-resolution vars.SYNC_UPSTREAM_REPO set (forks only)
.github/workflows/signing-guard.yml Actively runs on PRs/pushes touching workflows: YAML-structure-aware CWE-77 scanner for inline ${{ }} expansions in secret-bearing jobs (scripts/check-signing-workflow-injection.sh, includes --self-test negative fixture) n/a — read-only lint, no secrets, python3+PyYAML are runner-preinstalled
.github/local-workflows.txt Registry of files the fork sync auto-resolves "ours" on conflict read only by sync-upstream
Formula/wirerust{,-a,-b,-d,-rc}.rb Homebrew formula templates (placeholders sed'd at publish); parallel channel installs (wirerust + wirerust-a coexist) read only by the publish jobs
packaging/Info.plist, scripts/create-{app,dmg,pkg}.sh macOS .app/.dmg/.pkg packaging helpers invoked only by sign jobs

Notes for review

  • All uses: are 40-char SHA-pinned and pass the existing action-pin gate. dtolnay/rust-toolchain is pinned to a master SHA with an explicit toolchain: stable input rather than a versioned-branch snapshot — the versioned-branch SHAs hardcode their toolchain and silently ignore the toolchain: input (we hit this live: two failed runs before the fix; wirerust needs 1.91 and has no rust-toolchain.toml to mask it, since this repo intentionally tracks rolling stable).
  • Security posture: run-blocks in secret-bearing jobs env-bind all context expressions (CWE-77), alpha tags are reserved atomically via the GitHub API (no TOCTOU), verification steps use set -eo pipefail + mktemp/trap. The signing-guard workflow enforces the env-binding rule structurally and fails closed.
  • Bundle identifier is com.arcavenae.wirerust in packaging/Info.plist + create-pkg.sh — per the jira-cli convention this reflects the first signing fork; a different signing fork overrides it to match its own Apple team. Happy to change if you'd prefer a placeholder.
  • Formula descriptions stay ≤ 80 chars including channel suffixes (Homebrew's brew audit desc cap); the templates carry the audit rules as comments.
  • The CHANGELOG gate is untouched: this PR modifies only .github/, Formula/, packaging/, scripts/.

Verified in production (ArcavenAE/wirerust)

  • Alpha channel: signed + notarized + stapled binaries/pkg/dmg published, brew install arcavenae/tap/wirerust-a verified (Developer ID chain + hardened runtime).
  • Stable channel: v0.12.1 backfilled, signed, brew install arcavenae/tap/wirerust verified; parallel install with wirerust-a confirmed.
  • Sync: scheduled merges green across main/develop/factory-artifacts.

If merged as-is, the fork and upstream copies are byte-identical, so future scheduled syncs remain conflict-free and the local-workflows.txt entries become pure insurance. mise users also get mise use github:Zious11/wirerust@latest for free from the release assets.

arcaven added 7 commits July 15, 2026 18:31
…ream sync)

Port the ArcavenAE/jira-cli fork-friendly release-ops pipeline
(docs/specs/fork-friendly-release-ops.md there) to the wirerust fork:

- sign-and-publish.yml: five channels — develop push → alpha
  (wirerust-a, builds from source), v*-dev.* → wirerust-d,
  v*-beta.* → wirerust-b, v*-rc.* → wirerust-rc, v*.*.* → wirerust.
  Apple codesign + notarize + staple, .pkg/.dmg packaging, Homebrew
  tap formula publish. All jobs gated on SIGNING_ENABLED /
  HOMEBREW_TAP_REPO repository variables.
- sync-upstream.yml: scheduled merge from Zious11/wirerust
  (main/develop/factory-artifacts) with protected-file auto-resolution
  via .github/local-workflows.txt. Gated on SYNC_UPSTREAM_REPO.
- backfill-release.yml: manual-dispatch build+release+sign for an
  existing tag. No scheduled gap-fill automation is installed.
- signing-guard.yml: fork-local CI job running
  scripts/check-signing-workflow-injection.sh (CWE-77 YAML-aware
  scanner) — hosted as a separate workflow instead of a ci.yml job
  so the upstream-shared ci.yml stays conflict-free.
- Formula templates (wirerust, -a, -b, -d, -rc) for parallel channel
  installs; packaging/Info.plist + create-app/dmg/pkg scripts adapted
  to the wirerust binary and com.arcavenae.wirerust bundle id.

Differences from the jira-cli original: no embedded-OAuth build env or
smoke checks (wirerust has none), backfill matrix matches upstream
release.yml targets (no aarch64-linux cross build).
The SHA-pinned dtolnay/rust-toolchain ref cannot infer the toolchain
from the ref name and defaulted to rustc 1.85.0; wirerust requires
1.91. jira-cli masks this via rust-toolchain.toml (channel = stable),
which wirerust does not carry. Applies to sign-and-publish alpha-build
and backfill-release build.

Refs: run 29458958576
The previous SHA is a snapshot of the action's 1.85.0 versioned branch,
which hardcodes its toolchain and rejects the toolchain input
('Unexpected input(s) toolchain'). Pin master, which requires and
honors an explicit toolchain spec.

Refs: run 29459130005
Homebrew's desc cop caps the description at 80 characters. The
channel-suffix pattern makes long base descriptions a latent audit
failure (jr-a sits at 79/80 today). Drop the redundant 'tool written
in Rust' and use short channel suffixes so every variant stays under
55 characters.
These templates are the copy source for the next repo's release ops;
the comment travels with the copy so the 80-char desc cap (including
channel suffix) is visible at authoring time.
Zious11 added a commit that referenced this pull request Jul 18, 2026
…WITH-CHANGES — DEFERRED by human; triage preserved
Zious11 added a commit that referenced this pull request Jul 19, 2026
…velop=fcd57dc

- STATE.md D-476: PR #414 (ArcavenAE ci/scorecard-guard) ADOPTED; security-triaged
  SAFE-WITH-CHANGES; F1 CWE-494 RESOLVED-CLEAN (all 4 SHA↔tag MATCH, no advisories);
  CI 13/13 incl. action-pin-gate; human squash-merge fcd57dc 2026-07-19T01:54:40Z
- develop_head updated: 82ad2edfcd57dc
- PR-414-FORK-SCORECARD carry-forward CLOSED/ADOPTED; SCORECARD-ENABLEMENT-RUNBOOK
  carry-forward added (F2 CWE-200 + optional harden-runner bump v2.19.4→v2.20.0)
- PR-407-FORK-RELEASE-OPS remains OPEN (disjoint files, no overlap)
- Session Resume Checkpoint: D-476 steady-state ACTIVE; open: PR #407, STORY-166/175..179
- planning/pr-414-security-triage.md: security triage report + F1 SHA verification
  section appended (RESOLVED-CLEAN, dated 2026-07-19)
- planning/vsdd-factory-upstream-issues.md: upstream issues planning artifact
- sidecar-learning.md: session-end markers appended
Zious11 added a commit that referenced this pull request Jul 20, 2026
Record decision D-484: session resumed from D-483 pause (human-approved,
2026-07-20). Worktree health PASS (factory-artifacts 5f9218d, 0 ahead/behind);
develop=fa9be701 verified; no story worktrees; no in-flight work.

Human decisions at resume:
1. Resume point = STORY-176 v2.2 per-story delivery (wave-84 3/3), wave-84 gate after.
2. Dependabot github-actions PRs #422-425 DEFERRED to DEP-SOAK-FOLLOWUP-2026-07-27.
   PR #423 (harden-runner 2.20.0) satisfies SCORECARD-ENABLEMENT-RUNBOOK re-pin watch
   (window watch satisfied; no manual re-pin needed).
3. PR #407 governance remains pending/unchanged.

STATE.md changes:
- pipeline: PAUSED → ACTIVE
- frontmatter current_step + timestamp refreshed
- EXACT RESUME POINT updated to D-484 active state
- Last Updated / Project Metadata Mode rows updated
- Phase Progress Wave-84 row: PAUSED → RESUMED (D-484)
- Concurrent Cycles wave-084 row updated
- Current Phase Steps: D-480 housekeeping row rolled out (last-5 rule); D-484 added
- Decisions Log: D-484 appended
- SCORECARD-ENABLEMENT-RUNBOOK carry-forward updated (PR #423 arrived, deferred)
- DEP-SOAK-FOLLOWUP-2026-07-27 carry-forward updated (adds PRs #422-425)
- Session Resume Checkpoint replaced with D-484 ACTIVE checkpoint
- Historical Content: D-480 housekeeping + D-484 checkpoint archive rows added
- Banner wc-l: 292 lines (verified)

Cycle files:
- cycles/wave-084/burst-log.md: D-480 housekeeping row archived (last-5 overflow)
- cycles/wave-084/session-checkpoints.md: D-483 SESSION WRAP checkpoint archived
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.

2 participants