State that the GitHub mirror is not running

a82a5efe0bad · AtlantisPleb · · parent ee1eb7790a39

State that the GitHub mirror is not running

REPOSITORY-002 claimed the forge mirrors main to GitHub itself. It can, but
`:forge_mirror_urls` is empty in `config/config.exs` and no environment sets
it, so `mirror_url/1` returns nil, `MirrorWatch` reports off, and GitHub only
ever holds what someone pushed to it directly. A contract that describes a
process nobody runs is worse than no contract.

The guard and the ledger now say what is true: the forge is authoritative
because of the WAL, not because of a mirror; configuring the mirror is what
completes the contract; and since `mirror_now/1` is a `git push --mirror`,
configuring it overwrites whatever direct pushes left on GitHub rather than
merging with them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016o8HwTaqLKEWCHTjsjFtrB
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>

Deploy story

What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.

Not deployed through the forge lane

No push, promotion, build, or deploy receipt references this commit (receipts are scanned over a bounded recent window). Changes shipped by full node replacement carry their proof in the release gate receipt instead.

Changed files

  • modified AGENTS.md
  • modified INVARIANTS.md
  • modified ops/ci/push-remote-check.sh

Diff

3 files changed, +33 -18

AGENTS.md modified +7 -5

@@ -21,11 +21,13 @@ git push openagents HEAD:main

21 21
```
22 22
23 23
The `openagents` remote is the forge at `openagents.com`, which records every
24
push in the durable WAL and mirrors `main` to GitHub itself. The `origin`
25
remote is that GitHub mirror; pushing to it directly leaves the forge behind
26
its own mirror, and nothing reports the divergence until a clone disagrees
27
with the site. `ops/ci/push-remote-check.sh` refuses a non-forge push, and
28
`.githooks/pre-push` runs it. See `INVARIANTS.md`, REPOSITORY-002.
24
push in the durable WAL and serves it. The `origin` remote is the GitHub
25
mirror; pushing to it directly leaves the forge behind a mirror it does not
26
know about, and nothing reports the divergence until a clone disagrees with
27
the site. Automatic mirroring to GitHub is not configured today, so GitHub
28
stays at whatever was last pushed to it. `ops/ci/push-remote-check.sh` refuses
29
a non-forge push, and `.githooks/pre-push` runs it. See `INVARIANTS.md`,
30
REPOSITORY-002.
29 31
30 32
## Project guidelines
31 33
INVARIANTS.md modified +12 -3

@@ -1796,11 +1796,20 @@ Evidence: `OpenAgents.Repositories`, `OpenAgents.Repositories.Provisioner`,

1796 1796
Status: Current
1797 1797
1798 1798
This repository's own commits reach the forge first. The forge records each
1799
push in the durable WAL and mirrors `main` to GitHub itself, so GitHub is a
1799
push in the durable WAL and serves what the WAL holds, so GitHub is a
1800 1800
projection of the forge in the same sense that a slug is a projection of a
1801 1801
GitHub ID. A push sent straight to GitHub inverts that: the WAL never sees the
1802
objects, the mirror watch compares the forge against a mirror that is ahead of
1803
it, and nothing reports the divergence until a clone disagrees with the site.
1802
objects, and nothing reports the divergence until a clone disagrees with the
1803
site.
1804
1805
The mirror that would keep GitHub current is not running. `mirror_url/1` reads
1806
`:forge_mirror_urls`, which is empty in `config/config.exs` and set by no
1807
environment, so `MirrorWatch` reports `off` and GitHub receives only what
1808
someone pushes to it. `mirror_now/1` is a `git push --mirror`, a force push of
1809
every ref, so configuring a mirror overwrites whatever direct pushes left on
1810
GitHub rather than merging with it. Configuring that mirror is what makes this
1811
contract complete; until then it keeps the forge authoritative and lets GitHub
1812
go stale, which is the honest trade and not an accident.
1804 1813
1805 1814
`ops/ci/push-remote-check.sh` admits only forge hosts and refuses every other
1806 1815
remote, whatever URL form it takes. `.githooks/pre-push` runs it before the
ops/ci/push-remote-check.sh modified +14 -10

@@ -3,13 +3,17 @@ set -eu

3 3
4 4
# Refuses a push to anything but the OpenAgents forge.
5 5
#
6
# The forge is the authority for this repository. It records every push in the
7
# durable WAL, and it mirrors `main` to GitHub itself
8
# (`OpenAgents.Forge.Pushes.mirror_now/1`, watched by
9
# `OpenAgents.Forge.MirrorWatch`). A push sent straight to GitHub arrives
10
# behind the forge's back: the WAL never sees those objects, the mirror watch
11
# compares the forge against a mirror that is now ahead of it, and the
12
# divergence stays invisible until a clone disagrees with the site.
6
# The forge is the authority for this repository: it records every push in the
7
# durable WAL, and the site serves what the WAL holds. A push sent straight to
8
# GitHub arrives behind the forge's back -- the WAL never sees those objects,
9
# and the divergence stays invisible until a clone disagrees with the site.
10
#
11
# The forge can mirror `main` to GitHub (`OpenAgents.Forge.Pushes.mirror_now/1`,
12
# watched by `OpenAgents.Forge.MirrorWatch`), but `:forge_mirror_urls` is empty
13
# in `config/config.exs` and no environment sets it, so no mirror runs today.
14
# Until one is configured, GitHub receives only what someone pushes to it, and
15
# `mirror_now/1` is a `git push --mirror` -- a force push -- so a configured
16
# mirror would overwrite whatever a direct push left there.
13 17
#
14 18
# Git hands a pre-push hook the remote's name and URL on argv. Called directly,
15 19
# take the same two arguments; a name alone is resolved through `git remote`.

@@ -40,9 +44,9 @@ fi

40 44
cat >&2 <<MESSAGE
41 45
Refusing to push to ${remote_name:-this remote} ($remote_url).
42 46
43
Pushes go to the OpenAgents forge, which records them in the WAL and mirrors
44
main to GitHub itself. Pushing to GitHub directly leaves the forge behind its
45
own mirror.
47
Pushes go to the OpenAgents forge, which records them in the durable WAL and
48
serves them. Pushing to GitHub directly leaves the forge behind a mirror it
49
does not know about.
46 50
47 51
  git push openagents HEAD:main
48 52

This page updates live while a promote is in flight · changelog