feat(mirrors): force-push every mirror from one verb, then verify #968
No reviewers
Labels
No labels
burndown-2026-06
burndown-2026-08
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/infrastructure!968
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/wz68-mirror-push"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Forgejo's web UI syncs one repository at a time, so forcing the whole set meant three visits or three API calls by hand.
It verifies rather than trusting the push
A
200means Forgejo accepted the request, not that the far side kept the refs. That distinction is the entire argument of coilysiren/inbox#441, so the push would be dishonest without it:It reuses
check_mirror_sync.evaluate, so the verification is the same code the scheduled watch runs, not a second opinion that could drift from it.Why a separate script rather than a flag
check_mirror_sync.pyneeds no credential: both forges are public and it only reads. Pushing needs the Forgejo admin token. Adding a--pushflag would have dragged that requirement into the module the scheduled workflow imports, and the credential-free property of that job is worth protecting deliberately rather than by accident.Both read the same
scripts/mirror-targets.json, so the pusher and the watcher can never cover different sets.Behaviour worth knowing
--onlyname is refused outright rather than silently pushing nothing.500with a useful body when the remote rejects the push, so that body is surfaced instead of the bare status.Tests
8 new, covering URL parsing in both directions and each upstream answer shape. Nothing reaches the network or the token store. Existing 12 still green.
Exercised live before landing:
--only umbra, all three, and the unknown-name refusal.