Make the gate report its own landing status
The blocker should not be something a reader has to remember. The gate now derives it every run: it reads the sigil floor out of package.sgl, finds the monorepo commit that introduced (sigil grant), and asks whether any tag contains it.
Reported, not asserted. This gate answers "is the migration CORRECT", and correctness does not depend on whether the dependency has shipped. But a green gate on an unlandable branch is exactly the state someone merges by accident, so it prints the reason in full and names the one field that gates the merge.
It also derives the answer rather than reciting it, so it stops being true the moment a tag appears -- at which point it prints the release to set the floor to instead.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DYn8wxSdjveEgK9NRxFcNA
scripts/gate-system-grant-migration | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)scripts/gate-system-grant-migrationmodified
[ "$NEXP" -eq 8 ] || red "the module exports $NEXP symbols, not 8. The public API was to be UNCHANGED; an addition is as much a change as a removal."say " exactly 8, nothing added: ok"# ------------------------------------------------------------# LANDING STATUS. Reported, not asserted: this gate answers "is the# migration CORRECT", and correctness is independent of whether the# dependency has been released. But the blocker must not be something a# reader has to remember, so the gate states it every run and derives it# rather than reciting it.# ------------------------------------------------------------rulesay "LANDING STATUS"FLOOR="$(grep -E '^[[:space:]]*sigil:' "$REPO/package.sgl" | head -1 | sed -E 's/.*sigil:[[:space:]]*"([^"]*)".*/\1/')"say " package.sgl declares sigil: \"$FLOOR\""MONO="/home/daviwil/Projects/Code/sigil/sigil"if [ -d "$MONO/.git" ]; then GRANT_COMMIT="$(git -C "$MONO" log --format=%H -1 -- packages/sigil-stdlib/src/sigil/grant.sgl 2>/dev/null)" if [ -n "$GRANT_COMMIT" ]; then TAGS="$(git -C "$MONO" tag --contains "$GRANT_COMMIT" 2>/dev/null | head -3)" if [ -n "$TAGS" ]; then say " (sigil grant) is RELEASED in: $(echo "$TAGS" | tr '\n' ' ')" say " ACTION: set the floor to the release above, then this branch is landable." else say " (sigil grant) landed in monorepo $(git -C "$MONO" rev-parse --short "$GRANT_COMMIT") and is in NO TAG." say " => NOT LANDABLE YET. Consumers resolve caret ranges against TAGS, so" say " no floor written today can resolve it. This branch is complete" say " EXCEPT the sigil: field, and that field is the only thing gating" say " the merge. Do not SHA-pin to route around it." fi fifirulesay "Logs kept at: $SCRATCH"say "MIGRATION COMPLETE PASS"