# Static vs capability authority **🟠 Advanced · Lesson 11** WHAT THE ROOM KIND ACTUALLY CHANGES. StaticRiftSpace and CapabilityRiftSpace override exactly TWO properties of RiftSpace, and they are the two that matter: command_system StaticCommandSystem / CapabilityCommandSystem frame_viewer StaticFrameViewer / FrameViewer THE DOING ONE AND THE SEEING ONE. workstation, event_system and memory_system are inherited unchanged, so the room's storage and signalling are constant while its AUTHORITY and its VISIBILITY both narrow together. That pairing is the design. A room you may not mutate is also a room that shows you less - and melder does it the same way twice, by handing you a different class rather than guarding a shared one. AND HERE IS THE DESIGN DECISION WORTH LEARNING FROM. The static room does not REFUSE meld(). It does not raise PermissionError, it does not check a flag, it does not consult an ACL at call time. IT SIMPLY DOES NOT HAVE THE METHOD. melder's own note on StaticCommandSystem says it outright: "Does not expose topology mutation or direct meld(...) because those methods now live on the capability surface INSTEAD OF BEING DENIED AFTER INHERITANCE." That is the opposite of the usual pattern, where a subclass inherits everything and then overrides the dangerous half to raise. Melder builds authority UP by class membership instead of tearing it DOWN by guard. WHY THAT IS BETTER, CONCRETELY: - There is no refusal path, so there is no refusal path to test, no error message to get subtly wrong, and no gap between "the guard is there" and "the guard is correct". - Capability becomes STATICALLY ENUMERABLE. You can answer "what may this room do" without executing anything and without triggering a single refusal. - hasattr becomes an honest question again. In a deny-after- inherit design it lies - the attribute is there and calling it explodes. THE AIX SURFACE Both kinds expose list_supported_command_methods(). A room will tell you what it can do. For an agent that is the difference between probing a surface by trying things and reading it. WHAT MOVES BETWEEN THEM static - reads, spell status, and meld_existing_spell (REUSE of something already created; no creation, no topology) capability - all of that PLUS direct meld(), link/sever_link, create_lesser_conduit, and the cluster verbs (create/delete/join/leave/list) ## 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/11_static_vs_capability_authority.py ``` ```powershell py -3.14t UX_and_AIX_experiences/03_advanced/11_static_vs_capability_authority.py ``` {download}`Download this collection <../../downloads/advanced-examples.zip>` · [Source on GitHub](https://github.com/Synaptic724/melder/blob/90d52e0a12cb0743d62568d5a19ce954a54443bc/UX_and_AIX_experiences/03_advanced/11_static_vs_capability_authority.py) ## Public surface StaticCommandSystem vs CapabilityCommandSystem via room.command_system, list_supported_command_methods ## Code ```{literalinclude} ../../downloads/03_advanced/11_static_vs_capability_authority.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 - [Enable Nexus and open a Rift](../../advanced/nexus.md) - [Read-only rooms for endpoints](../../advanced/read-only-rooms.md) - [Workstation ownership](../../advanced/workstation.md)