# Two knobs and a terminator per rung **🔵 Expert · Lesson 06** THE LAST TWO PUBLIC NAMES, and what they say about the whole configuration story the curriculum has been tracking since advanced 07. MutationResearchConfiguration has exactly TWO knobs: with_unrestricted_module_mutations(enabled) with_lane_type_enforcement(enabled) Two. That is the entire configurable surface of a subsystem with 49 public methods, and the smallness is the point - the research plane records what happened; it does not need a policy engine to do it. Compare AethericFrameConfiguration's fourteen (advanced 05): a frame is a WORLD and needs a law book. A research set is a LEDGER and needs almost nothing. WHAT THE TWO KNOBS ACTUALLY GOVERN unrestricted_module_mutations - whether the plane will record mutations that reach outside a spell's own module. Off is the conservative posture. lane_type_enforcement - whether LaneType (expert 03) is a RULE or a LABEL. You met this on the ResearchSet as a live setter; here is where the default comes from. That second one is worth noticing: the SAME switch exists in two places, at two scopes. The configuration sets the default for new sets; ResearchSet.set_lane_type_enforcement overrides it per set. A knob at both scopes is a deliberate answer to "is this a house rule or a per-experiment choice" - melder says both. AND THE BUILDER CLOSES THE CONFIGURATION ARC. Advanced 17 measured nine public configuration objects carrying FIVE different terminator sets. This builder is the most generous shape in that table, tied with the crystallizer's: build() hand me the configuration finalize() ...frozen activate() ...and in force ONE TERMINATOR PER RUNG. You choose where to get off the ladder, instead of always landing on rung one and climbing manually the way AetherConfigurationBuilder makes you. THE LADDER, ONE LAST TIME (and this is the fourth subsystem): Aether caller activates the config (advanced 07) Crystallizer caller activates the config (advanced 17) MutationResearch caller activates the config (here) Nexus activate() finalizes it FOR you (advanced 08) Three to one. Caller-driven activation is the house rule and Nexus is the exception - which is worth knowing before you meet a fifth subsystem and have to guess. AND THE FOURTH ROOT HAS CAUGHT UP. Nexus was once the one root of four with NO builder at all - its callers built the configuration by hand while every other root handed one over. It now carries the same three exits, so the generosity table above is no longer lopsided. What has NOT changed is the two-bits rule: the builder's `activate()` marks the CONFIGURATION active, and you must still pass it to `Nexus.activate(...)`. Two objects, two bits. THE EXITS ARE ONE-SHOT, WHICH IS THE POINT OF A BUILDER. Each exit TRANSFERS OWNERSHIP and consumes the builder; a second exit raises. That is what makes a builder different from a config you keep poking - there is exactly one owner at each step, and the handoff is the moment ownership moves. AND `build()` EARNS ITS PLACE ON THIS ROOT. The builder mirrors only the one knob almost everyone sets; the configuration carries a far wider `with_*` surface (frame allow/deny lists, tokens, nested rift policy). `build()` is the exit that hands you back something still MUTABLE so you can reach the rest. A frozen-only builder would have made the wide surface unreachable through it. ## Before you run Use the [Expert guide](../../expert/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/04_expert/06_two_knobs_and_a_terminator_per_rung.py ``` ```powershell py -3.14t UX_and_AIX_experiences/04_expert/06_two_knobs_and_a_terminator_per_rung.py ``` {download}`Download this collection <../../downloads/expert-examples.zip>` · [Source on GitHub](https://github.com/Synaptic724/melder/blob/0895ce795453cd87e35d70665957b4e89aad3317/UX_and_AIX_experiences/04_expert/06_two_knobs_and_a_terminator_per_rung.py) ## Public surface md.MutationResearchConfiguration, md.MutationResearchConfigurationBuilder, md.NexusConfiguration, md.NexusConfigurationBuilder ## Code ```{literalinclude} ../../downloads/04_expert/06_two_knobs_and_a_terminator_per_rung.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 expert examples](index.md) · [Level guide](../../expert/index.md) ## Related guides - [Persistence, profiles, and source custody](../../expert/persistence.md) ## API contracts - [NexusConfiguration](../../reference/api/inspection/nexusconfiguration.md) - [NexusConfigurationBuilder](../../reference/api/inspection/nexusconfigurationbuilder.md) - [MutationResearchConfiguration](../../reference/api/research/mutationresearchconfiguration.md) - [MutationResearchConfigurationBuilder](../../reference/api/research/mutationresearchconfigurationbuilder.md)