ci: add fork-sync — upstream→fork release-cadence sync (registry-first) - #12
Conversation
Sibling of hardened-sync (PR #9), opposite direction: hourly release-watch against upstream releases/latest + workflow_dispatch catch-up. Overlay footprint computed at runtime keeps ours on conflict; upstream canonical elsewhere; modify/delete both directions resolved; unresolved conflicts fail loudly (never push stale tip); MERGE_HEAD + parent-count gates close the phantom-push hole; output = new sync/fork-resolved-<n> ref + PR, merge OPERATOR-GATED. Companion state seed: .github/fork-sync-state.json (v2026.9.14 = fork main already absorbed through that release on 2026-09-20). Provenance: DARKXSIDE directive (fork receives upstream updates at dev release cadence); local transports failed 5x on the operator seat, CI is the transport (PRs #9/#10/#11 receipts).
Fork main absorbed upstream through v2026.9.14 on 2026-09-20 (PR #11 lineage). Hourly ticks stay quiet until upstream ships the next release.
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository: POWERFULMOVES/PMOVES-hermes-agent/.coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
૮ >ﻌ< ა ci reviewran on fa9856b — ci(fork-sync): seed release-watch state at v2026.9.14 ℹ️ InfoCI-sensitive file review · View jobPR touches sensitive files, but the Sensitive files changed: debug infoCI timingsCI timings · View report · View jobWall time 476m vs 1440m20s (-67.0%). 11 job(s) slower, 7 faster, 1 unchanged.
|
Label audit:
|
| File | Size | Commit | Verification |
|---|---|---|---|
.github/workflows/fork-sync.yml |
6,931 bytes | 5b294d691 |
read-back IDENTICAL; trigger = workflow_dispatch + hourly schedule (release-watch tick) |
.github/fork-sync-state.json |
40 bytes | fa9856bc6 |
read-back IDENTICAL; content {"last_upstream_release": "v2026.9.14"} (seed = fork main already absorbed through that release via the PR #11 lineage) |
Checklist applied to fork-sync.yml:
- Permissions:
contents: write+pull-requests: write— the PR-creation output requires both; named in the PR body as the moment to object - Scope: workflow_dispatch + schedule only; output is always a NEW
sync/fork-resolved-<n>ref + operator-gated PR; never touchesmainorPMOVES.AI-Edition-Hardeneddirectly - No secrets patterns beyond
secrets.GITHUB_TOKEN; no self-hosted runners; no curl-pipe-to-shell - Concurrency:
group: fork-sync, cancel-in-progress false (hourly ticks queue rather than clobber) - Fail-loud: unresolved conflicts →
::error+ exit 1;MERGE_HEADconclusion + parent-count ≥2 gates close the phantom-push hole (same as hardened-sync PR ci: add hardened-sync — registry-first Hardened<-main reconciliation #9) - Resolution policy: overlay footprint computed at runtime (merge-base diff, not hardcoded lists) — overlay files keep ours, upstream canonical elsewhere
Registry-first reconciliation named in the PR body: NousResearch#2976 (registry-driven fork list vs this single-fork source_repo input) and NousResearch#2962 (GitHub App as the durable cross-repo release-tracker). Known limitation named: release-watch keys on release tags, not main pushes (last_upstream_main_sha companion = follow-up lane).
Precedent + authority
PR #9 (hardened-sync, same pattern, merged) and PR #10 (33-file audit table, comment 5768548326, merged). Operator authority: DARKXSIDE — "the fork should get the same updates at the same time as upstream dev releases… trigger CI/CD for the hardened branch" + "approved for option 2". Merge of this PR remains operator-gated per its own body; the hourly cron registers on merge and cannot merge anything itself.
|
CI disposition — Facts, from the job log (receipted this session):
Why this doesn't block the merge: PR #12's diff is exactly two files — Merge proceeding under temporary ruleset pause (restored immediately after), the receipted #10 pause→merge→restore pattern (#11 landed by greening its gate via rerun instead). Attempt 3 has been cancelled (receipted: run 35731685313, attempt 3, conclusion |
Summary
Adds the fork-sync automation — the upstream→fork direction of the registry-first sync doctrine. Sibling of
hardened-sync.yml(PR #9, merged), opposite direction: forkmainabsorbs upstreammainat dev-release cadence, per operator directive ("the fork should get the same updates at the same time as upstream dev releases… trigger CI/CD for the hardened branch").This PR adds two files and executes nothing:
workflow_dispatch+ hourlyschedule(release-watch tick), output is always a newsync/fork-resolved-<n>branch + operator-gated PR.Drift receipts (why now)
mainvs upstreammainmainhardened-syncafter fork main landsNousResearch/hermes-desktopandPOWERFULMOVES/hermes-desktop404); the desktop isapps/desktop/inside hermes-agent, so desktop drift is the 931How it works
releases/latestvs tracked state (.github/fork-sync-state.json, seededv2026.9.14— fork main already absorbed through that release via the PR sync(main): promote the PMOVES overlay line — upstream through 2026-09-20 + 48-commit overlay, AUDIT INSIDE #11 lineage). Quiet unless the tag changes AND no unlanded resolved branch exists.MERGE_HEADconclusion + parent-count ≥2 (closes the phantom-push hole, same as hardened-sync PR ci: add hardened-sync — registry-first Hardened<-main reconciliation #9).sync/fork-resolved-<n>ref + draft-mode PR. Merging that PR is OPERATOR-GATED.Registry-first cross-refs (reconcile, don't duplicate)
fork_synctooling concept reads a hardcoded 28-fork list instead of the 72-entry registry. This workflow is single-fork by design (source_repoinput, default upstream) and is the natural consumer for a registry-driven fork list; reconcile in the [Bug]: WhatsApp bridge only checks node on PATH and misses usable macOS runtimes NousResearch/hermes-agent#2976 lane rather than growing a second hardcoded list.GITHUB_TOKENand issource_repo-parameterized, so additional forks are config, not code.Known limitation (named, follow-up lane)
release-watch keys on upstream releases, not main pushes. Upstream main moved past v2026.9.14 (pushed 09-20 23:16Z); that movement waits for the next release tag. A
last_upstream_main_shacompanion field in the state file gives dev-branch parity — one-line design addition, follow-up PR.Activation note
Merging this PR registers the hourly cron. It cannot merge anything itself — output is PRs;
main/Hardenedmerges stay operator-gated. The standing directive pre-authorizes the capability; this PR is the moment to object to hourly cadence if wrong.Verification
Both files uploaded to
ci/fork-sync-workflowand read-back byte-verified IDENTICAL:fork-sync.yml(commit5b294d691, 6,931 bytes),fork-sync-state.json(commitfa9856bc6, 40 bytes, content{"last_upstream_release": "v2026.9.14"}— read-back receipt7b26809ceafter a gitmon 429 backoff).