diff --git a/stacks/waterland-studio/README.md b/stacks/waterland-studio/README.md index 5115e59..a05c974 100644 --- a/stacks/waterland-studio/README.md +++ b/stacks/waterland-studio/README.md @@ -100,16 +100,48 @@ service merely looks slow. - Internal render timeout is 480 s, which is why the healthcheck interval is loose — an aggressive probe would measure queue depth rather than liveness. -## ⚠️ `update.sh` needs a credential this host does not have +## Source credential — `claude-bot`, read-only -The repo is not anonymously readable — an unauthenticated clone 403s. The -initial checkout was made with the operator's `vh` site-admin token passed -inline and **not persisted**: the on-disk remote is the plain URL and -`.git/config` holds no token (verified). Consequently `git fetch` in -`update.sh` will fail until the host has a credential of its own. +The repo is not anonymously readable (an unauthenticated clone 403s), so the +host needs a credential to fetch. Operator granted **`claude-bot` read on +`vh/waterland`** on 2026-08-19; verified scoped correctly: -`claude-bot` 404s on `vh/waterland`, so it currently lacks read access. The -right fix is a read-only deploy token for this host, or granting `claude-bot` -read on the repo — **not** writing the site-admin token to disk on a GPU box. -Raised with waterland-dev; until then, re-run the authenticated clone by hand -to update. +``` +admin: False | push: False | pull: True +``` + +The token lives on irv-ml1 at `/root/.config/waterland-studio/git-credentials`, +mode `0600`, root-owned, and is wired as a **repo-scoped** credential helper — +not a global one: + +```bash +git -C /opt/waterland-studio/src config credential.helper \ + 'store --file=/root/.config/waterland-studio/git-credentials' +``` + +`.git/config` itself holds no token (verified), so the remote URL stays clean +in any diff, log or backup of the checkout. + +The operator's `vh` site-admin token was used **only** for the initial clone +and the grant itself, passed inline and never written to disk on this host. +Do not reintroduce it: a site-admin credential on a GPU box is a blast radius +nobody needs for a read-only fetch. + +## ⚠️ Upstream finding: the on-disk job store grows without bound + +The job index is **memory-only** — `JobStore._jobs` is a plain dict, and +nothing scans `WATERLAND_STUDIO_DATA` at startup. Two consequences: + +1. After any restart the UI and `/api/jobs` list only jobs created *since* + that restart, even though every earlier job's files are still on the volume. + This is cosmetic and not data loss — verified at cutover: the API reported + 1 job while the volume held all 16 directories (60.6 MB). +2. More importantly, the `RETAIN = 40` self-eviction only ever sees in-memory + jobs, so directories orphaned by a restart are **never** reclaimed. The + handover's "bounded around 500 MB" holds within a single process lifetime; + across restarts the store grows monotonically at ~12 MB per animated job. + +Growth is slow, so this is not urgent, but it is unbounded and the volume will +need occasional pruning until upstream rehydrates the index (or sweeps orphans) +at startup. Reported to waterland-dev — it is their call, not a thing to patch +from the infrastructure side.