Commite4e2f92dRecorded2 Sep 2026Repositorysigil-system

Make the gate report its own landing status

Message

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

Changed
 scripts/gate-system-grant-migration | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)
Diff
scripts/gate-system-grant-migrationmodified
@@ -274,6 +274,35 @@ say " all 8 public exports present: ok"
274
[ "$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."
275
say " exactly 8, nothing added: ok"
276
+277
# ------------------------------------------------------------
+278
# LANDING STATUS. Reported, not asserted: this gate answers "is the
+279
# migration CORRECT", and correctness is independent of whether the
+280
# dependency has been released. But the blocker must not be something a
+281
# reader has to remember, so the gate states it every run and derives it
+282
# rather than reciting it.
+283
# ------------------------------------------------------------
+284
rule
+285
say "LANDING STATUS"
+286
FLOOR="$(grep -E '^[[:space:]]*sigil:' "$REPO/package.sgl" | head -1 | sed -E 's/.*sigil:[[:space:]]*"([^"]*)".*/\1/')"
+287
say " package.sgl declares sigil: \"$FLOOR\""
+288
MONO="/home/daviwil/Projects/Code/sigil/sigil"
+289
if [ -d "$MONO/.git" ]; then
+290
GRANT_COMMIT="$(git -C "$MONO" log --format=%H -1 -- packages/sigil-stdlib/src/sigil/grant.sgl 2>/dev/null)"
+291
if [ -n "$GRANT_COMMIT" ]; then
+292
TAGS="$(git -C "$MONO" tag --contains "$GRANT_COMMIT" 2>/dev/null | head -3)"
+293
if [ -n "$TAGS" ]; then
+294
say " (sigil grant) is RELEASED in: $(echo "$TAGS" | tr '\n' ' ')"
+295
say " ACTION: set the floor to the release above, then this branch is landable."
+296
else
+297
say " (sigil grant) landed in monorepo $(git -C "$MONO" rev-parse --short "$GRANT_COMMIT") and is in NO TAG."
+298
say " => NOT LANDABLE YET. Consumers resolve caret ranges against TAGS, so"
+299
say " no floor written today can resolve it. This branch is complete"
+300
say " EXCEPT the sigil: field, and that field is the only thing gating"
+301
say " the merge. Do not SHA-pin to route around it."
+302
fi
+303
fi
+304
fi
+305
306
rule
307
say "Logs kept at: $SCRATCH"
308
say "MIGRATION COMPLETE PASS"