v0.4.0
The host contract is committed, and found out from the host's own docs
LOOP_GATES, LOOP_CLEAN_WORKTREE, LOOP_SIZE_EXCLUDES and LOOP_DENIALS_EXTRA are facts about the repository, the same for everyone who builds in it. They move out of the gitignored .loop/loop.env into a committed .loop/host.env, reviewed like any other file.
- The loop reads
host.envbeforeloop.env; the shell still overrides both.--dry-runreports where the gates came from. - There is no default gate. A repository that declares none is refused at pre-flight, naming the file.
- The agent finds it out.
/shipgains a step 0: whenhost.envis missing or names no gates, it reads the host'sAGENTS.md/CLAUDE.md, derives the four values from what the host documents, shows each line beside the sentence it came from, and commits the file on the feature branch./run-gatesderives the gates the same way when the file is missing and says so; it never invents a default. loop.envkeeps what is personal: the two sandbox credentials,LOOP_MODEL,LOOP_SANDBOX, the bounds.reclaim-worktree.shandunit-size.shreadhost.envfirst;install.shvendorshost.env.distand leaveshost.envalone.
Upgrade from 0.3.0
Move the four host lines from .loop/loop.env into a committed .loop/host.env (format in .loop/host.env.dist), or let the next /ship write it. Until then pre-flight refuses with the file's name.