cat /tmp/claude-1000/-home-david-projects-bpi-stack/3b4bfe1e-d8ae-4050-b437-0fcc0870de42/tasks/bspcrj0b8.output; SCRATCH=/tmp/claude-1000/-home-david-projects-bpi-stack/3b4bfe1e-d8ae-4050-b437-0fcc0870de42/scratchpad; grep -cE "PASSED" $SCRATCH/static-final2.log; grep -E "exists remotely" $SCRATCH/static-final2.log $SCRATCH/webapp-final2.log | head -4
STATIC-EXIT: 0 WEBAPP-EXIT: 0 8 /tmp/claude-1000/-home-david-projects-bpi-stack/3b4bfe1e-d8ae-4050-b437-0fcc0870de42/scratchpad/static-final2.log:2026-07-24 13:03:44.206930: Base container ghcr.io/bozemanpass/static-content-base:69bfeb07c741b02a34a24ae92991cb06b9b466da exists remotely. /tmp/claude-1000/-home-david-projects-bpi-stack/3b4bfe1e-d8ae-4050-b437-0fcc0870de42/scratchpad/webapp-final2.log:2026-07-24 13:04:02.727791: Base container ghcr.io/bozemanpass/nextjs-base:068b52d97e0ed711dddf897fdce9b29e7a81db11 exists remotely.
# Recent New Features - [#161](https://github.com/bozemanpass/stack/pull/161) Deploy wrapped repositories (e.g. pure static HTML) directly from a stack via the `wrapper` field in stack.yml
# Recent New Features - [#163](https://github.com/bozemanpass/stack/pull/163) Prebuilt wrapper base images pulled from ghcr; `wrapper-ref` pinning and `wrapper.lock` for repeatable wrapped builds - [#161](https://github.com/bozemanpass/stack/pull/161) Deploy wrapped repositories (e.g. pure static HTML) directly from a stack via the `wrapper` field in stack.yml
The file /home/david/projects/bpi/stack/docs/recent-features.md has been updated successfully. (file state is current in your context — no need to Read it back)
Everything is green and the working tree is ready for your PR:
wrappers.py (scoped resolution, fetch_wrapper_repo, wrapper_repo_info, lock read/write), build_containers.py (prepare_wrapper_base_container pull-or-build, wrapper-ref/lock handling in the wrapped path), build_util.py (wrapper-ref field), build_webapp.py (--wrapper-ref, prebuilt base path), constants.py (wrapper.lock name).wrappers.md (prebuilt bases, pinning/locking, CI-publish expectation for wrapper authors), stack-files.md (wrapper-ref, wrapper.lock section), recent-features.md (entry as #163 — fix if the number lands differently).--wrapper-ref incl. error case; both full suites pass cold with the pull path proven in the logs.Suggested short PR description: "Pull prebuilt wrapper base images from ghcr (keyed on the wrapper repo commit hash, published by wrapper repo CI), falling back to local build. Add wrapper-ref to pin a wrapper repository/branch, and wrapper.lock (analogous to container.lock) for repeatable wrapped builds."
And the test-coverage work for the fetch/lock paths is queued in my notes as the next item whenever you want it.
Thanks, this all sounds great. Wondering: are there links from the docs in this repo to the wrapper repos, so someone looking to figure out how the whole system works can find them?
grep -n "stack-wrapper\|stack-test-static" docs/*.md README.md | grep -v Binary
docs/stack-files.md:43: wrapper-ref: bozemanpass/stack-wrapper-static-content@main docs/wrappers.md:21:| `webapp` | `bozemanpass/webapp-base` | [stack-wrapper-webapp](https://github.com/bozemanpass/stack-wrapper-webapp) | docs/wrappers.md:22:| `nextjs` | `bozemanpass/nextjs-base` | [stack-wrapper-webapp](https://github.com/bozemanpass/stack-wrapper-webapp) | docs/wrappers.md:23:| `static-content` | `bozemanpass/static-content-base` | [stack-wrapper-static-content](https://github.com/bozemanpass/stack-wrapper-static-content) | docs/wrappers.md:81: wrapper-ref: bozemanpass/stack-wrapper-static-content@main docs/wrappers.md:144:[stack-wrapper-static-content](https://github.com/bozemanpass/stack-wrapper-static-content) for
The image is built through the normal container pipeline (content-hash tagging, repository fetching and locking all apply) and is referenced from the pod's composefile like any other container image, e.g. `image: bozemanpass/my-static-site:stack`.
The image is built through the normal container pipeline (content-hash tagging, repository fetching and locking all apply) and is referenced from the pod's composefile like any other container image, e.g. `image: bozemanpass/my-static-site:stack`. For a complete working example, see [stack-test-static-content](https://github.com/bozemanpass/stack-test-static-content) (a repository containing only static HTML, with no container build files) and the `test-static-content` stack in [stack-test-stacks](https://github.com/bozemanpass/stack-test-stacks) that builds and deploys it via the `static-content` wrapper.
The file /home/david/projects/bpi/stack/docs/wrappers.md has been updated successfully. (file state is current in your context — no need to Read it back)
sed -i 's|docs/webapp.md|docs/wrappers.md|' /home/david/projects/bpi/stack-wrapper-webapp/README.md /home/david/projects/bpi/stack-wrapper-static-content/README.md && grep -n "wrappers.md" /home/david/projects/bpi/stack-wrapper-webapp/README.md /home/david/projects/bpi/stack-wrapper-static-content/README.md
/home/david/projects/bpi/stack-wrapper-static-content/README.md:16:- `wrapper.yml` — the wrapper manifest (see the stack tool's `docs/wrappers.md`) /home/david/projects/bpi/stack-wrapper-webapp/README.md:20:`docs/wrappers.md`), the base image `Containerfile`, the app-image `Containerfile.webapp`,
So to answer directly: yes, and now more completely. The link graph is:
README.md → docs/wrappers.md, whose available-wrappers table links both wrapper repos, the authoring section links stack-wrapper-static-content as the minimal example, and (new just now) the stack.yml usage section links the full working example — the pure-HTML stack-test-static-content repo plus the test-static-content stack in stack-test-stacks that deploys it.docs/wrappers.md (was docs/webapp.md) — that's a two-line change sitting in your wrapper repo clones to push whenever convenient.So someone landing in any of the repos can walk the whole system. The stack-repo side of these edits is in the working tree along with the rest of the batch for your PR.
Sounds good. Two small reminders for the push: verify the PR number in docs/recent-features.md (I guessed #163), and the wrapper repo clones each have the two-line README pointer update (docs/webapp.md → docs/wrappers.md) to push separately whenever convenient.
That completes the whole wrapper roadmap — abstraction, external repos, static content, stack.yml integration, cleanup, prebuilt bases, and version locking. The only queued follow-up is the dedicated test coverage for the fetch/lock paths, noted in my memory for whenever you want to pick it up.
The docs are accurate as written, then — nothing to correct. Once #163 merges and you push the wrapper README tweaks, everything's consistent across all five repos. Give me a shout whenever you want to tackle the fetch/lock test coverage or anything else.
Yes — the feature as we scoped it across this whole arc is complete:
wrapper.yml manifests (#160)wrapper: in stack.yml, deployment-level test, docs consolidation (#161)webapp-template special case and fixups retired (#162)wrapper-ref pinning, wrapper.lock (#163)The original goal — "a repository that only contains HTML can be deployed just by including it in a stack, with wrapping schemes discovered at runtime from their own repos" — is fully realized and regression-tested at every step.
Two loose ends, both minor and non-blocking:
docs/webapp.md → docs/wrappers.md) sitting in your wrapper repo clones, if you haven't pushed those yet.Updating my memory to mark the arc closed:
Also landed 2026-07-24: ghcr publishing of wrapper base images (CI in the wrapper repos, tag = repo commit sha), prebuilt-base pull-or-build (`prepare_wrapper_base_container`), `wrapper-ref` field/option, and `wrapper.lock` beside stack.yml.
Also landed 2026-07-24 (PR #163, merged): ghcr publishing of wrapper base images (CI in the wrapper repos, tag = repo commit sha), prebuilt-base pull-or-build (`prepare_wrapper_base_container`), `wrapper-ref` field/option, and `wrapper.lock` beside stack.yml. The feature arc (PRs #160–#163) is complete.
The file /home/david/.claude/projects/-home-david-projects-bpi-stack/memory/container-wrapper-schemes.md has been updated successfully.
All done — the wrapper system is shipped end to end. It was a satisfying arc: four PRs, each gated by the existing webapp test passing unchanged, ending with the static-content case that motivated the whole idea working from a bare index.html repo to a served deployment. Ready for the test-coverage round or anything else whenever you are.