Changes touching this path

  • a stale core stops saying grantSealed and starts saying rebuild: the SDK suite stamps what it was built from (#914) sdk/wasm/ is generated by wasm-pack from crates/loot-wasm and ignored by git AND by loot, so it is the one input to the SDK suite that no checkout, land or lane spawn ever updates — and nothing checked it. The failure did not look like staleness: measured during #880, an out-of-date core produced 14 failures inside test/grants.unit.test.ts naming an arity mismatch on grantSealed, which reads as a defect in sealed-grant handling. It cost a diagnosis aimed at the most security-sensitive code in the repo, for a bug that did not exist. So the value is not preventing the stale run, it is making the stale run SAY SO — the same shape as #843 and #847. `build:wasm` now records a stamp of what it built from; `pretest` compares it and refuses, naming the rebuild and the #880 misdiagnosis so the next reader does not repeat it. Content stamp, not mtime: this repo materializes whole trees routinely (every lane spawn, adopt, op restore), so mtime would cry stale on a correct build several times a day, and a guard that fires on a healthy tree gets switched off. The hash covers loot-wasm path-dependency CLOSURE (walked, so a new path dep joins on its own) plus the workspace manifest and lockfile — not all of crates/, which would demand a 30s wasm rebuild every time an unrelated crate moved. Proven in a lane: not-built refuses before vitest, a real wasm-pack build then passes the check, and one appended line in loot-codec is caught. The behaviour suites additionally need target/release binaries in the checkout — README now says so, since a fresh lane fails them with ENOENT until cargo build --release runs. 151884a4 · dbf3dbe6…

Renames are not followed. loot's tree maps a path to an address, so a rename is a delete and an add. This list is the history of the name, not of the bytes.