Record the pre-seed history import against the live forge

9eb1b2cfbb57 · AtlantisPleb · · parent edf529c765c1

Record the pre-seed history import against the live forge

The 307 commits behind this repository's seed are now in its own log.
Backfill.import_history/3 appended the bundle at sequence 426 under an
operator principal and closed all five recorded boundaries, so a clone through
the published transport serves 787 commits with no shallow file, git fsck
clean, and the pre-seed root readable. The mirror is no longer the only copy
of anything.

Two things the operation settled that the rehearsal had left open. A node
applies a new entry on its own schedule, and the third node sat a sequence
behind with its boundaries open until Sync.ensure_fresh/2 ran — which GitHttp
calls before serving any git request, so a lagging node converges before it
answers rather than serving a grafted history. And the rebuild from sequence
zero that made this an attended operation was never reached, so it stays
unexercised against the live projection and step 3's gap is unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SoZMfWRSGnf6FZX2Ar9rQ2
Co-Authored-By
Claude Fable 5 <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.

pushed
by user · WAL seq 427 · 2026-08-25T23:17:23.254706Z

Changed files

  • modified docs/forge-exit-rehearsals.md
  • modified docs/forge-operator-independence.md

Diff

2 files changed, +69 -21

docs/forge-exit-rehearsals.md modified +23 -7

@@ -414,7 +414,7 @@ behavior was exercised locally instead, by three tests in

414 414
live 423-commit projection is untested.
415 415
`docs/2026-08-25-forge-exit-rehearsals-2-to-6.md` records both halves.
416 416
417
**Step 4 re-measured later the same day, and step 5 is prepared but not run.**
417
**Step 4 re-measured later the same day; step 5 was prepared and then run.**
418 418
A fresh clone of each side: the forge serves 461 commits on `main`, `git fsck`
419 419
clean, grafted at five `shallow` boundaries rooted at `eda094c6`; the mirror
420 420
serves 767, `git fsck` clean, rooted at `a352f78e`, and `git rev-list --count

@@ -426,12 +426,28 @@ closes every boundary at once. Built from the mirror by the recipe in step 5

426 426
over `fdd00d4c`, `e0e61fb1`, `0fcbbbb8`, `f8a7822a`, and `c91327d6`, it is
427 427
7.2 MB and `git bundle verify` reports a complete history.
428 428
429
The import itself was not performed. It is a permanent append to a shared
430
production log, its failure mode is the fleet-wide rebuild step 3 has never
431
exercised live, and both belong to an attended operation rather than to a
432
read-only rehearsal. #188 records the decision — import the objects, keep the
433
push record starting at the seed — `docs/forge-operator-independence.md`
434
carries the reasoning, and #256 carries the operation.
429
**Step 5 performed 2026-08-25 (#256).** `Backfill.import_history/3` appended
430
the bundle at sequence **426** under `operator:14167547` and closed all five
431
boundaries; `open_boundaries/1` answered `[]` afterwards. Re-measured on a
432
fresh clone through the published transport, the forge now serves **787**
433
commits on `main` with no `shallow` file, `git fsck` clean, and
434
`git cat-file -t c91327d6` answering `commit` — against 461, five boundaries,
435
and an unreadable object before. `Verification.verify/2` reports no findings on
436
all three nodes, each at head sequence 426 on an identical chain link.
437
438
Two things this exercised that the rehearsal had listed as unknown. The
439
projection is node-local while the log is shared (#251): two nodes applied the
440
entry immediately and the third sat at 425 with its boundaries still open for
441
several minutes, converging only when `Sync.ensure_fresh/2` ran. That is the
442
call `OpenAgents.Forge.GitHttp` makes before serving any git request, so a
443
clone routed to a lagging node converges it before being answered rather than
444
receiving a grafted history. And the failure mode that made this attended — a
445
fleet-wide rebuild from sequence zero — was not reached on any node, so it
446
remains unexercised live and step 3's gap is unchanged.
447
448
#188 records the decision — import the objects, keep the push record starting
449
at the seed — and `docs/forge-operator-independence.md` carries the reasoning
450
and the measurements.
435 451
436 452
## 4. Key rotation
437 453
docs/forge-operator-independence.md modified +46 -14

@@ -298,10 +298,11 @@ holds the seed alone.

298 298
The forge's clone is not broken by this and `EXIT-004` is not violated by it.
299 299
The clone succeeds, passes `git fsck`, and writes a `shallow` file naming five
300 300
reconciled boundaries, which is `EXIT-004`'s stated outcome after #179: history
301
that says where it stops is servable, and history that dangles is not. What is
302
true is narrower and worth saying without softening it — **the forge is
303
canonical for its own history only from the seed forward**, and a reader who
304
wants this repository's first 307 commits has to get them from the mirror.
301
that says where it stops is servable, and history that dangles is not. That was the state until the objects were imported. **The forge is now
302
canonical for its whole history**: the pre-seed commits are in its own log, a
303
clone carries them, and no reader has to go to the mirror for them. The
304
paragraph above records what was measured before the import, because the
305
reasoning that follows it was decided against that state.
305 306
306 307
### The decision about the 307 commits
307 308

@@ -346,16 +347,47 @@ occasion, not by a code path reaching for GitHub: no module on the recovery

346 347
path gains a mirror call, and the proof that fails on one is untouched. What
347 348
changes afterwards is that the mirror stops being the only copy of anything.
348 349
349
**Not yet executed.** The bundle is built and verified — 7.2 MB, `git bundle
350
verify` reports a complete history, and it closes all five recorded boundaries
351
— and the recipe is in rehearsal 3 of `docs/forge-exit-rehearsals.md`. What is
352
left is a production write that cannot be undone: a WAL append is permanent by
353
design, `EXIT-005` makes removing an entry a rewrite of the whole suffix, and
354
if a node fails to materialize the new entry `OpenAgents.Forge.Sync` falls back
355
to a full rebuild from sequence zero, which rehearsal 3 records as never having
356
been run against the live projection. That is an attended operation on a forge
357
people are pushing to, not an unattended one, and #256 carries it rather than
358
this document describing it as done.
350
**Executed 2026-08-25.** `OpenAgents.Forge.Backfill.import_history/3` appended
351
the bundle to `openagents.com`'s log at **sequence 426**, under the principal
352
`operator:14167547`, and closed all five recorded boundaries:
353
354
| Boundary | Parent the import supplied |
355
| --- | --- |
356
| `eda094c6` (the seed) | `c91327d6` |
357
| `23f0d64c` | `0fcbbbb8` |
358
| `521c208d` | `fdd00d4c` |
359
| `70cadbb5` | `f8a7822a` |
360
| `1f32e14d` | `e0e61fb1` |
361
362
The bundle was built from a fresh mirror clone over those five parents, 7.3 MB,
363
and `git bundle verify` reported a complete history before it was copied to a
364
node. `open_boundaries/1` answered with the five commits before the import and
365
with `[]` after it.
366
367
Measured after the import, on a clone taken fresh through the published
368
transport:
369
370
| | Before | After |
371
| --- | --- | --- |
372
| `main` commits | 461 | 787 |
373
| `shallow` file | five boundaries | absent |
374
| `git cat-file -t c91327d6` | could not read | `commit` |
375
| `git fsck` | clean | clean |
376
377
The counts are at different tips; the gap is what closed.
378
379
`OpenAgents.Forge.Verification.verify/2` reports no findings on all three
380
nodes, each at head sequence 426 with an identical chain link. The projection
381
is node-local while the log is shared (#251), so a node applies a new entry on
382
its own schedule: two nodes had applied 426 immediately, and the third sat at
383
425 for several minutes with its boundaries still open. It converged when
384
`Sync.ensure_fresh/2` ran, which is what `OpenAgents.Forge.GitHttp` calls
385
before serving any git request — so a clone routed to a lagging node converges
386
it before it is answered rather than being served a grafted history. The
387
fallback that made this an attended operation, a rebuild from sequence zero,
388
was not reached on any node.
389
390
The mirror is no longer the only copy of anything.
359 391
360 392
## Exit
361 393

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