This repository has no description

give the box its own Tangled key, and sync config from the working tree master

Two gaps, both of which left work stranded. The box held no key reaching Tangled, only the Storage Box key, so pushing needed the operator's forwarded agent — which exists only while the operator is connected. An agent working unattended had no route for its work to leave the machine. laptop/tangled-key.sh generates a key on the laptop, escrows it as tangled-key, verifies the readback, and only then installs it at ~/.ssh/tangled_ed25519 mode 0600: the same order as the Storage Box key, and for the same reason, so a rebuild reproduces the key from the vault instead of needing its public half registered by hand again. Registering that public half is the one step no script here can do — there is no API — so the run ends by deferring it with the text to paste. A key that exists but was never registered fails exactly like a missing one, so verify.sh asserts the push path rather than the file. That assertion is no longer skippable, and it forces IdentityAgent=none: with an agent forwarded it would otherwise pass on the operator's identity while the box's own key was missing, proving the opposite of what it claims. Exactly one assertion may now SKIP. server/lib/45-ssh-config.sh names the key and matches tangled.sh as well as tangled.org, since remotes across the projects here are written both ways. The global agent configuration reached the box only through a full provisioning run, via `git archive HEAD`, so the box ran the last committed state and a dirty tree was refused outright. laptop/sync-config.sh ships the working tree instead. Its file list comes from `git ls-files --cached --others --exclude-standard` rather than the filesystem, which is load-bearing rather than tidy: ~/.claude is deny-by-default gitignored, so the payload is about 2 MB where the directory is over a gigabyte of session transcripts, and settings.local.json — ignored because it can hold credentials captured from an approved command line — stays out of it. The staging directory is replaced rather than overlaid, because neither `git archive | tar -x` nor an --files-from rsync removes anything, so a file deleted from the repository lived on the box forever. SYNC_OVERWRITE=1 is passed only by that script. deliver_rendered() defers on any difference, which is right for a provisioning run but would mean an explicit sync defers forever and never works twice (standing rule 18). The box's own state belongs in settings.local.json, which nothing there touches, so only the delivered artifact is replaced, and only after a backup. flit_remote_env() moves to lib/common.sh: two callers now run the same server-side script, and a second hand-written copy of that assignment list is the drift §13.2 keeps counting.