2026-05-13 — Path A vs Path E vs Gap H
User direction confirmed both contracts matter:
- Path A (deftest): prelude at OUTER top-level under do; parent shares prelude content
- Path E (deftest-hermetic): prelude INSIDE the closure; strict isolation; parent untouched
User: “users must make a choice where their programs run.” The substrate enforces the contract via shape; both shapes ship.
Gap G attempted Path E shape; substrate rejected define-at-expression-position. Sonnet refined Path A→two flavors:
- A-narrow: runtime local-env-frame registration (splits
definesemantics by position; rejected) - A-wide: closure-extraction lifts prelude defines into prologue (preserves “define = top-level registration” as single mental model; selected)
User decided: “A-wide is the path - let’s get it documented and in motion.”
The conceptual win in A-wide: define keeps its single meaning (top-level registration). The LIFT moves the form to where top-level processing happens. The substrate’s DefineInExpressionPosition rejection STAYS — never gets reached because the lift removes the form from expression position before eval sees it.