# Frames as worlds **🟠 Advanced · Lesson 02** Aetheric frames are WORLDS - the categories arc, act three. Act 1 (beginner 25): spellframes categorize spells WITHIN a world. Act 2 (intermediate 26): conduits categorize worlds of resolution. Act 3: aetheric_frame= names an ENTIRE ISOLATED WORLD - its own registries, its own control plane, its own posture, its own singletons. AND THE LINE THAT WALL DOES NOT CROSS, which is the real lesson: A FRAME IS A WORLD FOR INSTANCES AND RESOLUTION. IT IS NOT A NAMESPACE FOR IDENTITY. A spell_id is the SHA256 of the registered object's CODE - its methods and constructor, its class-level values, its bases - and of nothing from the bind call. READ THAT AGAIN AND NOTICE WHAT IS ABSENT: the frame, the spellframe, the binding_name. So two books on two different frames binding the same class mint THE SAME ID, whatever names they give it, and the second registration is refused process-wide. Moving to another frame is not a fix, and neither is another binding_name: one object is one spell. The fix is to make the CLASSES different, not the worlds or the names: one subclass per world. A subclass is a new class, so a new spell_id, and every world can then keep it at the SAME address. Once you do, everything you expect from a world wall holds - `unique` is one instance PER FRAME, each world reuses its own singleton forever, and nothing leaks across. THE OTHER WAY is a regime, not a binding: with `process_wide_unique_spell_ids` turned off before the first frame exists, a spell_id is unique per FRAME, and one class may live in several worlds. That is Aether configuration, and a lesson never installs it - lessons share one interpreter (advanced 07). The probe suite pins it in a reset world. WHY IT IS BUILT THIS WAY: one spell_id names one spell, everywhere. An id that silently meant different things in different frames would make every checkpoint, every crystal and every research lane ambiguous the moment two frames existed. ## Before you run Use the [Advanced guide](../../advanced/index.md) for prerequisite concepts. Run from a checkout with Melder installed and Python 3.14 free-threading selected. The collection download includes the level's local helper modules. ## Run the saved script ```bash python UX_and_AIX_experiences/03_advanced/02_frames_as_worlds.py ``` ```powershell py -3.14t UX_and_AIX_experiences/03_advanced/02_frames_as_worlds.py ``` {download}`Download this collection <../../downloads/advanced-examples.zip>` · [Source on GitHub](https://github.com/Synaptic724/melder/blob/1211e838099a342c9dde48f064b1e772b6060e13/UX_and_AIX_experiences/03_advanced/02_frames_as_worlds.py) ## Public surface Spellbook(aetheric_frame=...), one class per world at one address, per-frame instance isolation ## Code ```{literalinclude} ../../downloads/03_advanced/02_frames_as_worlds.py :language: python :linenos: ``` ## Check the outcome The script contains its own assertions or demonstrated refusal paths. Run it to evaluate those checks against your installed version. The code above is taken directly from the saved file; no run output is invented here. [More advanced examples](index.md) · [Level guide](../../advanced/index.md) ## Related guides - [Frame boundaries: isolated worlds](../../advanced/worlds.md) - [World inspection walkthrough](../../advanced/inspection-walkthrough.md) ## API contracts - [Spellbook](../../reference/api/binding/spellbook.md)