# The workstation canvas **🟠 Advanced · Lesson 12** THE WORKSTATION - the room's binding canvas, and the last fixture in arc B. Every RiftSpace owns one, whatever its kind. WHAT IT IS: a room-local scratchpad that holds things across steps. WHAT IT IS NOT, and this is the contract that matters: "Stores only room-local bindings; it does not discover or resolve new targets from Melder/Nexus." The workstation is NOT a resolver, NOT a registry, and NOT a second spellbook. It holds what you hand it. If you want something out of melder you get it through the command system (lesson 11) and then park it here. Keeping those two jobs apart is why the canvas can be wiped without touching the world. THREE LOGICAL STORES, kept separate on purpose: objects bind_object(name, value) attributes bind_attribute(name, value) methods bind_method(name, value) Same name can live in two stores without collision, because `get` and `release` take a `store=` selector. ONE ACTIVE TARGET AT A TIME set_target(name, store=...) select a saved binding as THE target get_target() read it back call_target(*args) invoke it (optionally re-binding the result straight back onto the canvas) clear_target() deselect without deleting the binding "At most one active target" is a deliberate ceiling. A canvas with many simultaneous targets is a canvas where "the target" stops meaning anything. WEAK BY REQUEST, AND NEVER BY ACCIDENT weak_ref=True force weak storage weak_ref=False force strong storage weak_ref=None use the room-local default captured at creation And the rule worth carrying to the rest of the library: "Explicit weak binding RAISES when the supplied value cannot be weak-referenced; IT NEVER SILENTLY DEGRADES TO STRONG STORAGE." That is the same honesty you met at validate() in lesson 06, which raises instead of returning False. Melder would rather fail loudly than quietly give you something adjacent to what you asked for. A silent degrade here would mean an object you believed was collectable is pinned for the life of the room - a leak that looks like correct code. ## 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/12_the_workstation_canvas.py ``` ```powershell py -3.14t UX_and_AIX_experiences/03_advanced/12_the_workstation_canvas.py ``` {download}`Download this collection <../../downloads/advanced-examples.zip>` · [Source on GitHub](https://github.com/Synaptic724/melder/blob/0895ce795453cd87e35d70665957b4e89aad3317/UX_and_AIX_experiences/03_advanced/12_the_workstation_canvas.py) ## Public surface md.Workstation via room.workstation - bind_object, bind_method, get, release, describe_bindings, set_target/get_target/clear_target, weak_ref semantics ## Code ```{literalinclude} ../../downloads/03_advanced/12_the_workstation_canvas.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 - [Workstation ownership](../../advanced/workstation.md) ## API contracts - [Workstation](../../reference/api/inspection/workstation.md)