Docs for strangers: real quick start, own-shelves guide, clone-safe stub guard

README rewritten for a fresh clone: working status, quick start with
env-var table and per-stage commands, photo-taking guidance, a
bring-your-own-shelves section (this repo carries the author's live
data), tokenless workflows, and a dev section. New committed
data/STUB_DATA.marker closes a real gap: the cache marker is
gitignored, so a fresh clone had stub-derived to_add.csv with no
guard — upload now refuses on either marker. Username docs: BGG_USERNAME
in .env is the one place it's needed; config.toml is a fallback.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Eric Wagoner
2026-08-02 13:33:52 -04:00
co-authored by Claude Fable 5
parent 02a7ac262c
commit 8e3cdc145f
7 changed files with 113 additions and 13 deletions
+12 -3
View File
@@ -415,14 +415,23 @@ def run_upload(
rng = rng or random.Random()
now = now or (lambda: datetime.now(UTC).isoformat(timespec="seconds"))
marker = cfg.cache_dir / "STUB_FIXTURES.marker"
if marker.exists():
# Two provenance markers guard the same fact from different angles: the
# cache marker travels with the stub XML (gitignored, so a fresh clone
# loses it), while data/STUB_DATA.marker is COMMITTED alongside the
# stub-derived CSVs — so a clone can never upload placeholder ids.
markers = [
cfg.cache_dir / "STUB_FIXTURES.marker",
cfg.data_dir / "STUB_DATA.marker",
]
marker = next((m for m in markers if m.exists()), None)
if marker is not None:
if not dry_run:
typer.echo(
f"Refusing to upload: {marker} exists — every resolved "
"version_id is a synthetic stub placeholder. Once "
"BGG_API_TOKEN arrives: delete both cache dirs, re-record "
"fixtures, `resolve --force`, re-review, re-diff."
"fixtures, `resolve --force`, re-review, re-diff, then "
"delete the marker(s)."
)
raise typer.Exit(code=1)
typer.echo(