Initial population
What this layer does
Phase 6 is the one-time seed of DO Spaces canonical from Robert's machine. Until this runs, s3://robert-storage/snappy-os/ and s3://robert-storage/snappy-kernel/ are empty and Joe pulls return zero files. Phase 6 closes that loop by pushing the local canonical through the Worker.
Files involved
~/projects/snappy-os/— local canonical on Robert's machine
(mini OS).
~/projects/snappy-kernel/— local canonical on Robert's machine
(kernel skills reference library).
bin/cli.js— thepush --scope allinvocation.state/log/migrations.ndjson— Phase 11 completion marker that
Phase 6 refuses to skip.
state/log/sync-events.ndjson— receives one row per pushed file.
Procedure
cd ~/projects/snappy-os
snappy-os push --scope all --dry # verify the manifest
snappy-os push --scope all # do it (Worker writes DO)
cd ~/projects/snappy-kernel
snappy-os push --scope all --repo kernel --dry
snappy-os push --scope all --repo kernel
The Worker authenticates Robert's SNAPPY_MASTER_KEY, derives his tenant_id, recognizes him as the canonical author, and writes to the public-tier prefix s3://robert-storage/snappy-os/ and s3://robert-storage/snappy-kernel/. Per-tenant data goes to snappy-os-tenants/<tenant_id>/; the canonical author writes to the unprefixed root.
Operational gotchas
- Phase 11 must complete first. Bootstrap on Robert's machine refuses
Phase 6 until state/log/migrations.ndjson shows the Robert-machine migration row. Otherwise the push captures stale canonical state (pre-symlink, divergent local copies).
--scope allon the first run is correct becauseprogram.mdand
sources/ need to land in DO. Subsequent auto-pushes default to --scope state.
- Use
--dryfirst. The first push uploads thousands of files;
verifying the manifest delta catches accidental inclusions (build artifacts, editor swapfiles).
- The Worker enforces
sync-rules.jsonserver-side too. Astate/log/
path that matches neither allow nor deny is rejected with a clear error; resolve by adding to one list.
- Both repos need pushing. Skipping snappy-kernel leaves Joes pulling
from an empty kernel canonical, which makes kernel slash commands appear missing on every Joe machine.
How to verify it's working
snappy-os status --repo osshows zero diff after push completes.curl -H "Authorization: Bearer <Joe-key>" https://skills.snappy.ai/_pull?since=0&repo=os
returns a manifest listing the seeded files.
- A second machine running
npx snappy-osand then
snappy-os pull --scope all gets a populated ~/projects/snappy-os/.
- The catalog at
https://skills.snappy.ai/lists every public-tier
skill within 5 minutes (one scheduled-handler tick).
state/log/sync-events.ndjsonshows oneop:"push"row per repo
with bytes and files populated.