Repository navigation
sync-skill: stack on open sync PRs, ask instead of stopping, and match CI locally - #128
Merged
Merged
Conversation
…d mobile-web typecheck
…ce-add ignored tree-conflict paths
… recognize tag-tip workflow swaps
…ung/sync-skill-handsoff
…ung/sync-skill-handsoff
…ung/sync-skill-handsoff
…sync pushes - check-pr-verify-selections: every job verify requires has a selection pr-code-change-scope.mjs emits, and every script pr.yml runs exists (it names v1.4.230's unroutable dependency_isolation job) - replay-pr-preflight: runs pr.yml's preflight steps locally in one pass instead of one CI round per failing step - wait-pr-checks: one background wait that exits on the first gating failure, a moved head, or a green gate after an advisory window - pr.yml: drop the mobile CI tools step's reference to a test the fork deletes, which the selection check found - .gitignore: ignore the release-JavaScript benchmark's default output dir
…and match CI locally From the v1.4.230 retro, which read every session of that sync: - an open older-tag sync PR is now the base to stack on and close, not a hard stop that stalled the sync for days three times - escalations put the decision to the human through orca ask and wait up to 12h; a run never ends its turn while its PR is open - Step 8 adds a clean-tree check, the verify-selection check, both PR guards and a local replay of pr.yml's preflight job - Step 6 sweeps the release for upstream signing, runner and repo identity - Step 10 defines pr.yml as gating and every other workflow as advisory, waits with one background command, and Step 11 merges after a 15-minute advisory window with --match-head-commit - one writer per sync PR; fix commits stage by path - the fix policy may remove a pr.yml job the release cannot route, with a ledger entry to restore it - qualifying skill-only lesson PRs are merged by the run
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
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.
ELI5
The daily upstream sync kept needing a person. It stopped for days whenever an older sync PR was still open, and it found its CI failures one at a time, each costing a 20–60 minute CI round. This PR makes the sync skill build on the open PR instead of stopping. It also makes the skill ask the user and wait when it needs a decision, and run locally the checks CI would otherwise fail on.
What Changed
Before: an unattended sync stopped at Step 2 whenever an older
sync: absorb upstream <tag>PR was open. PR #120 sat green and unmerged for 68 hours while three daily runs stopped behind it. Any human decision ended the run. After the push, v1.4.230's PR took 7 hours and 8 CI rounds to go green. Four of those rounds were failures in thestatic analysisjob, one new step per round, because that job stops at its first failure and unit tests wait behind it.After:
.claude/skills/sync-upstream/SKILL.md):orca askwith a 12-hour wait, and a run never ends its turn while its PR is open.preflightjob.pr.ymlas gating and every other workflow as advisory. It waits with one background command.--match-head-commit.pr.ymljob the release cannot route, with a ledger entry to restore it later.config/scripts/fork-sync-gate/(Tier 1, declared as featurefork-sync-gate):check-pr-verify-selections.mjsproves every jobverifyrequires is routed bypr-code-change-scope.mjsand that every scriptpr.ymlruns exists. Against v1.4.230's tagpr.ymlit reports thedependency_isolationdefect that failed every PR.replay-pr-preflight.mjsreads thepreflightjob frompr.ymland runs every step it can locally, in one pass, in about 3 minutes. It skips the typecheck and steps whose condition only CI can evaluate, and names each skip.wait-pr-checks.mjsis a single background wait. It exits on the first gating failure, on a head moved by another writer, on a closed PR, or once the gate is green and the advisory window has closed.pr.yml: drops a reference towin32-test-lane-registration.test.mjs, which the fork deletes. The new check found it..gitignore: ignores the release-JavaScript benchmark's default output directory, which a fix commit on sync: absorb upstream v1.4.230 #122 swept in. Declared as a seam with its residual raised to +15/-2.Why
I read every session of the v1.4.230 sync (the lead, 10 re-home agents, the CI-driving sessions, and the PR-sitter sessions) and ranked what cost the most time. The user picked these two batches: stall-proofing and local CI parity. They also made the policy calls: stack and close rather than stop, merge with a 15-minute cap on advisory checks, allow removing an unroutable job with a ledger entry, auto-merge lesson PRs, and ask and wait up to 12 hours. I put the CI parity in scripts that read
pr.yml, not in a list kept in the skill, so they follow upstream's step changes automatically. A hand-kept list is exactly what drifted on the fork's localization wrapper.Not in this PR: the resolution tooling (a scripted
pr.ymltransform, re-home helpers) and the PR-sitter fixes. The user deferred both.Linked Issue
N/A (fork maintenance)
Visual Proof
N/A: tooling and skill text only, no UI change.
Testing
check-pr-verify-selections.mjspasses on this branch. Against v1.4.230's tagpr.ymlit reportsdependency_isolationand its missing test file.replay-pr-preflight.mjsruns end to end on this branch (every replayable step green). Before the lint fixes it caught 4 findings in the new files themselves.wait-pr-checks.mjschecked against real PRs: merged sync: absorb upstream v1.4.230 #122 exits 4, green sync-skill: stack a directed sync on an open sync PR; recognize tag-tip workflow swaps #125 exits 0, and a wrong head exits 3.--verify-seamsand--verify-residualsall pass, andtypecheck:nodepasses.AI Disclosure
Written by Claude (Opus 5.5) in Claude Code at the user's direction.
Review
Agent skill upstream boundary
Notes
The scripts are Node and run anywhere the sync runs.
replay-pr-preflight.mjsneedsbash, which every GitHub runner and Git for Windows has. Nothing here touches the app, SSH, or mobile.Checklist
N/Awith reason