Written 21 Oct 2026, when Mabel moved to a new computer. The repository is only part of the project: 5 GB of media lives in the bucket, and two directories of real work live in neither. This is the inventory and the order to restore it in.
| Where it lives | What is in it | How it gets to the new machine |
|---|---|---|
| git (`gitlab.com/inkylabs/the-offer-luther-short`) | script, sheets, notes, `tools/`, `refs/provenance.json`, `refs/index.json` | `git clone` |
| `gs://the-offer-assets/refs/` | 5.0 GB — every take, still, cut and sound cue, plus `threads.jsonl` and the other review ledgers | `python3 tools/assets.py pull refs` — read the warning below first |
| `gs://the-offer-assets/probes/` | 183 MB of probe work, including the retired cuts `evening-scene-24` and `-26` that `notes/morning-sheet-history.md` cites by path | `python3 tools/assets.py pull probes` |
| `gs://the-offer-assets/machine-move-20261021/` | the two directories that have no permanent home — staged for this move only | `gcloud storage rsync`, see below |
| `gs://inkylabs-corpus-backup/` | the reference shelf (~1.5 GB of books; only two files were ever pulled locally) | `python3 resources/sync-books.py` |
Neither is in git and neither was in the bucket before 21 Oct 2026. Both are referenced by committed notes at absolute paths, so they have to land back in the same places or those notes dangle.
Restore both with:
``` gcloud storage rsync --recursive \ gs://the-offer-assets/machine-move-20261021/blender-checkpoints ~/blender-checkpoints gcloud storage rsync --recursive \ gs://the-offer-assets/machine-move-20261021/the-offer-review ~/.local/share/the-offer-review ```
The `machine-move-20261021/` prefix is a staging area, not a decision about where set files belong. Delete it once the new machine is up, or decide on a real home for the Blender work and write that down here.
`assets.py pull refs` is not symmetric with push. The bucket keeps every take ever pushed, culled ones included — 964 objects against a working set of 708 — and `pull` rewrites `refs/index.json` from whatever ends up on disk. So a straight pull restores 248 culled files and relists them as current, which is exactly the resurrection `AGENTS.md` warns about. After pulling:
``` git checkout refs/index.json # restore the committed cull decisions python3 - <<'PY' # list what the index does not claim import json, pathlib keep = set(json.load(open('refs/index.json'))['files']) for p in sorted(pathlib.Path('refs').rglob('*')): if p.is_file() and p.suffix not in {'.json', '.jsonl'} and str(p) not in keep: print(p) PY ```
Delete those, then run `python3 tools/assets.py push refs` — otherwise the next push writes the culls back into the index and they return for good.
The repo's own scripts are stdlib-only, so there is nothing to `pip install` for `tools/`. Everything else: